class Person(models.Model):
name = models.CharField('Name')
class Book(models.Model):
name = models.TextField('Name', blank = True, null = True)
author = models.ForeignKey(Person, related_name='book')
CharField
- 必须设置属性
max_length
,对应于数据库基本类型varchar
,设置最大长度有利于节省数据库空间;
TextField
- 没必要同时设置
blank=True
和null=True
的; blank=True
意味着该字段(表单内容)可以不填,对数据库无影响;null
表示数据库中该字段可以为空;
TextField
和CharField
如果为空字符串或者无字符,在数据库中都以""
存储。
ForeignKey
- on_delete是必须设置的
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
- on_delete=models.CASCADE,意思是如果一个person删除了,其对应的所有books要删除
- on_delete=models.SET_NULL,如果一个person删除了,其对应的所有books变为NULL
- related_name 是用来做反向查询的名字,如果不设置related_name, 你要从Person反查Book就要使用Person.book_set.filter()或者Person.book_set.all()。如果设置了related_name, 你就可以使用Person.book了。
。注意一旦设置了related_name, 你将不能再通过_set方法来反向查询。
常见的Django Model META类选项
Django中的日期处理
- DateTimeField、DateField和TimeField,其值分别对应着Python里的datetime.datetime、datetime.date和datetime.time三个实例,这三个Field里都有两个参数:auto_now和auto_now_add,默认值均为False。
- auto_now参数,每次保存对象时自动将字段值设置为当前时间,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在
需要存储“最后修改时间”的场景下,十分方便,常用类似“last-modified”或者"update_time"字段
。字段不能被手动修改覆盖;当设置为true时,只有每次调用Model.save()时,才会强制更新为当前时间点;当用其他方式更新其他字段时并不会更新 - auto_now_add参数设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。
该属性通常被用在存储“创建时间”的场景下
。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。 - 实际场景中,往往
既希望在对象的创建时间默认被设置为当前值,又希望能在日后修改它
,django中所有的model字段都拥有一个default参数,用来给字段设置默认值。可以用default=datetime.now来替换auto_now=True或auto_now_add=True。
常见的Django Model META类选项
from django.db import models
class Meta:
# 按Priority降序, order_date升序排列.
get_latest_by = ['-priority', 'order_date']
# 自定义数据库里表格的名字
db_table = 'music_album'
# 按什么排序
ordering = ['pub_date']
# 定义APP的标签
app_label = 'myapp'
# 声明此类是否为抽象
abstract = True
# 添加授权
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)