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


    编写博客的数据模型类

    设计数据库和表结构是做网站的基础。在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类中所规定的字段及其属性进行对照,进一步理解数据模型类中的各个属性含义。

     

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

  • 相关阅读:
    jquery 拼图小游戏
    重要参考SQL
    SQL Server save transaction
    SelectList类的构造函数
    一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
    springMVC,spring和Hibernate整合(重要)
    delphi环境变量
    C# Chart 点击获取当前点击坐标和Series
    如何修改 app.config 的配置信息
    C#中使用设置(Settings.settings) Properties.Settings.Default .(配置文件相当重要)
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/12198884.html
Copyright © 2020-2023  润新知