Django - models模型配置


几种关系:

一对一的关系: 一个作者只能有一个作者的详情,就是一对一

多对一的关系: 多本书籍对应一个出版社

多对多的关系: 一本书对应多个作者,一个作者也能对应多书籍

models.CASCADE - 表示级联

  • 一对一的关系 OneToOneField(on_delete=models.CASCADE)
  • 多对一的关系 ForeignKey(on_delete=models.CASCADE)
  • 多对多的关系 ManyToManyField
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

from django.db import models


class Publisher(models.Model):
name = models.CharField("名称", max_length=30) # 可以在第一个position添加为verbose_name
address = models.CharField(max_length=50, verbose_name="地址") # 可以使用verbose_name标签
city = models.CharField(max_length=10)
state_province = models.CharField(max_length=20)
country = models.CharField(max_length=50)
website = models.URLField()


class Author(models.Model):
name = models.CharField(max_length=20)


class AuthorDetail(models.Model):
sex = models.BooleanField(max_length=1, choices=((0, "男"), (1, "女")))
email = models.EmailField()
address = models.CharField(max_length=50)
brithday = models.DateField()
author = models.OneToOneField(Author, on_delete=models.CASCADE)


class Book(models.Model):
title = models.CharField(max_length=30)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
publication_date = models.DateField()

这里需要注意,就是你之前如果migrate数据库,那么有时候会报错,在进行迁移的时候是加迁移,并不会再创建表格。

定义数据模型的扩展属性 class Meta

详细文档:
https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/
https://docs.djangoproject.com/zh-hans/3.0/ref/models/options/

1
2
3
4
class Meta:
verbose_name = "名称"
verbose_name_plural = "复数名称"
ordering = ['排序字段'] # 比如以id倒叙 ordering = ['-id']

数据库同步:

一个目录: migrations

  • 里面存放的是makemigrations命令生成的数据库脚本。并且必须要有__init__.py文件夹才可以用

一张数据表,在数据库中: app_migrations

  • app: app名字
  • name: 脚本的文件名称
  • applied: 脚本执行的时间

数据库相关的命令:

  • flush 清空数据库,比较危险
  • makemigrations 生成数据库脚本
  • migrate 同步数据库
  • showmigrations 查看生成数据库的同步脚本
  • sqlflush 查看清空数据库的脚本
  • sqlmigrate 查看数据库同步的sql语句

在出现错误的时候可以migrations文件除了__init__.py删除掉,再删除数据库创建一个新数据库。