码迷,mamicode.com
首页 > 其他好文 > 详细

跟大佬学django-编写博客的数据模型类

时间:2020-01-15 23:24:36      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:生成   其他   情况下   mail   基础上   iter   running   并且   sqlite3   

编写博客的数据模型类

设计数据库和表结构是做网站的基础。在django中,我们不需要通过SQL语句直接跟数据库打交道,而是完全用python的方式创建数据库模型,之后交给django完成数据库的操作。

 

数据库模型类

利用django开发网站系统,一般情况下,要先编写数据模型,就是在./blog/models.py中写一个类,这个类与数据库中的数据表具有对应关系。

 

下面就在./blog/models.py中编写博客的数据模型类Blog,本质上它是一个继承了django.db.models.Model的类

定义BlogArticles模型类

./blog/models.py:

 

from django.db import models

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class BlogArticles(models.Model):
    title = models.CharField(max_length=300)
    author = models.ForeignKey(User, related_name="blog_posts")
    body = models.TextField()
    pulish = models.DateTimeField(default=timezone.now)
    
    class Meta:
        ordering = ("-publish",)
    
    def __str__(self):
        return self.title

  

代码中,title = models.CharField(max_length=300)定义了字段title,属性为CharField()类型,并且以参数max_length=30的形式说明字段的最大数量。

author = models.ForeignKey(User, related_name="blog_posts")通过author规定了博客文章和用户之间的关系—一个用户对应多篇文章,ForeignKey()就反映了这种“一对多”关系。类User就是BlogArticles的对应对象, related_name="blog_posts"的作用是允许通过类User反向查询到BlogArticles。

class Meta:
    ordering = ("-publish",)

上面两句从名称上看貌似python中的元类,但它跟元类不同,在此处,通过ordering = ("-publish",)规定了BlogArticles实例对象的显示顺序,即按照publish字段值的倒叙显示

 

BlogArticles类的数据模型编写好了,将来数据库表的基本结构就是按照上述各字段及其属性而定的。如何根据数据模型建立数据库表呢?跟着下面的步骤继续操作。

 

生成迁移:python manage.py makemigrations

在/mysite/manage.py位置执行python manage.py makemigrations,结果如下:

[root@localhost mysite]# python3 manage.py makemigrations

Migrations for ‘blog‘:

  blog/migrations/0001_initial.py:

    - Create model BlogArticles

上面的提示信息高速我们在blog/migrations目录中创建了一个BlogArticles模型,我们打开看下

[root@localhost migrations]# more 0001_initial.py

# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2019-10-13 08:09
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name=BlogArticles,
            fields=[
                (id, models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name=ID)),
                (title, models.CharField(max_length=300)),
                (body, models.TextField()),
                (publish, models.DateTimeField(default=django.utils.timezone.now)),
                (author, models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name=blog_posts, t
o=settings.AUTH_USER_MODEL)),
            ],
            options={
                ordering: (-publish,),
            },
        ),
    ]

 

这个文件不是我们编写的,是在执行python manage.py makemigrations之后django自动生成的。如果上述代码的含义不是很清楚,还可以用下面的方法看下该文件的本质。

查看迁移文件的sql代码python3 manage.py sqlmigrate blog 0001

[root@localhost mysite]# python3 manage.py sqlmigrate blog 0001

BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"));
CREATE INDEX "blog_blogarticles_4f331e2f" ON "blog_blogarticles" ("author_id");
COMMIT;

 

这只是换一种方式来查看,如果读者熟悉SQL语句,就知道上述文件的功能是创建一个名称为blog_blogarticles的数据库表。这个表的名称由两部分组成,第一部分blog是本应用的名称,第二部分blogarticles(都小写)是在models.py中创建的数据库模型类的名称,中间用单下划线连接。

 

再观察数据库表中的字段名称,除id是自动生成外,其他都是在数据模型类BlogArticles中所声明的字段及其属性。

 

上面创建了一个能够建立数据库表的文件,下面就在此基础上,真正创建数据库了。

创建数据库python3 manage.py migrate

[root@localhost mysite]# python3 manage.py migrate

Operations to perform:

  Apply all migrations: admin, auth, blog, contenttypes, sessions

Running migrations:

  Applying contenttypes.0001_initial... OK

  Applying auth.0001_initial... OK

  Applying admin.0001_initial... OK

  Applying admin.0002_logentry_remove_auto_add... OK

  Applying contenttypes.0002_remove_content_type_name... OK

  Applying auth.0002_alter_permission_name_max_length... OK

  Applying auth.0003_alter_user_email_max_length... OK

  Applying auth.0004_alter_user_username_opts... OK

  Applying auth.0005_alter_user_last_login_null... OK

  Applying auth.0006_require_contenttypes_0002... OK

  Applying auth.0007_alter_validators_add_error_messages... OK

  Applying auth.0008_alter_user_username_max_length... OK

  Applying blog.0001_initial... OK

  Applying sessions.0001_initial... OK

 

[root@localhost mysite]# ls

blog  db.sqlite3  manage.py  mysite

 

对于db.sqlite3这个文件,可以安装一个名为SQLiteSpy的客户端工具,打开保存在项目根目录中的数据库文件db.sqlite3,这个文件可以在pycharm中通过deployment把linux下的该文件下载到windows中,然后SQLiteSpy打开这个文件,如下图所示:

 技术图片

 

 

在tables下列出了本项目中目前已有的数据库表,除blog_blogarticles是刚刚通过BlogArticles模型建立的外,别的都是项目默认创建的数据库表。

 

选中blog_blogarticles后,右边显示该数据库表结构,仔细观察一下每个字段的数据类型,将这里的结果和前面的数据模型类BlogArticles类中所规定的字段及其属性进行对照,进一步理解数据模型类中的各个属性含义。

 技术图片

 

 

这样就建立了博客的数据库—这是基础,接下来就是发布博客,并保存到这个数据中。

跟大佬学django-编写博客的数据模型类

标签:生成   其他   情况下   mail   基础上   iter   running   并且   sqlite3   

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/12198884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!