代码改变世界

105-定义更多的模型,并使他们关联

2019-08-17 16:06  lzhshn  阅读(169)  评论(0编辑  收藏  举报

前面只定义了title模型,也就是日记或博客的标题,还需要定义其内容,即:content模型。

 

1、首先在models.py里新增模型

# 定义另一个模型:CnbContent,这个模型和CnbTitle关联,一个是标题,一个是内容
class CnbContent(models.Model):
    # title_relation属性表示这个CnbContent和哪个CnbTitle关联,并且通过on_delete规定,如果一方被删除了,另一方如何操作
    title_relation = models.ForeignKey(CnbTitle, on_delete=models.CASCADE)
    text = models.TextField()
    date_add = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text[:64] + '...'

 

后续,我们测试了on_delete=models.CASCADE的删除关联性:

分别设置a,b,然后让b关联a,则删除b时,a不会被删除;但是删除a,则a和b都会被删除:

 

 

2、接着,我们到admin.py里进行注册

from django.contrib import admin
from .models import CnbTitle, CnbContent

# Register your models here.
# 请注意:每个app都有自己的admin模块,但是一个工程只有一个admin页面


# 注册test_app下的models
admin.site.register(CnbTitle)
admin.site.register(CnbContent)

 

3、将新的模型,添加到数据库里

 

lzhshn@lzhshn-Ryzen:~/PycharmProjects/FreeNote$ python3 manage.py makemigrations
Migrations for 'test_app':
  test_app/migrations/0002_auto_20190817_0747.py
    - Change Meta options on cnbtitle
    - Create model CnbContent
lzhshn@lzhshn-Ryzen:~/PycharmProjects/FreeNote$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, test_app
Running migrations:
  Applying test_app.0002_auto_20190817_0747... OK
lzhshn@lzhshn-Ryzen:~/PycharmProjects/FreeNote$

4、注意,在本示例中,标题和内容是分别放在两个class里的。假设需要显示一个目录,其实只需要显示所有标题即可,则通过使用标题的集合会更方便。所以对之前定义的CnbTitle进行了改造:

# Create your models here.
# 这个模型定义我在cnblogs里新建博文的标题,下含2个属性:文字内容,添加时间
# models是一个包,里面包括很多类,CnbTitle类继承于Model类,两个属性text和date分别是CharField类和DateTimeField类的对象
class CnbTitle(models.Model):
    text = models.CharField(max_length=128)
    date_add = models.DateTimeField(auto_now_add=True)

    # 如果要在某个地方区别地显示这个类的对象,使用如下方式
    # 这里表示用类的text属性来指代某个具体的对象
    def __str__(self):
        return self.text

 

 经过这样设置后,可以发现重新执行makemigrations和migrate时,会把后面追加的修改也包含进去。