django field constraint

Django中关于字段约束

blank和null

  • blank=True、null=True。统一的表明了该字段(列)是可以为空的。
  • blank=False、null=False。统一的表面了该字段(列)不可以为空。
  • blank=True、null=False。这个设定的意义在于,某些字段并不希望用户在表单中创建(如slug),而是通过在save方法中根据其他字段生成。
  • blank=False、null=True。这个设定不允许表单中该字段为空,但是允许在更新时或者通过shell等非表单方式插入数据该字段为空。

DateField中auto_now_add和auto_now

  • auto_now=True

    这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的

  • auto_now_add

    这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

  • 如何将创建时间设置为“默认当前”并且可修改
1
2
3
4
5
from django.db import models
import django.utils.timezone as timezone
class Doc(models.Model):
add_date = models.DateTimeField('保存日期',default = timezone.now)
mod_date = models.DateTimeField('最后修改日期', auto_now = True)

备注:
前台页面从数据库取值,需要格式化字符串,添加<td>\{\{ infor.updatetime|date:"Y-m-d H:i:s" \}\}</td>类似的过滤器。

外键约束(on_delete)

通常外键约束需要添加on_delete属性

  1. CASECADE:级联(常用)
    如果外键对应的那条数据被删除了,那么这条数据也会被删除
    1
    app2 = models.ForeignKey(App1, on_delete=models.CASCADE)

2.PROTECT: 受保护
即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据

1
app2 = models.ForeignKey(App1, on_delete=models.PROTECT)

3.SET_NULL: 设置为空
如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空

1
app2 = models.ForeignKey(App1, on_delete=models.SET_NULL, blank=True, null=True)

4.SET_DEFAULT :设置默认值

如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。

如果设置这个选项,前提是要指定这个字段一个默认值

1
2
# app/models.py
app2 = models.ForeignKey(App1, default='test_default', on_delete=models.SET_DEFAULT)

5.SET() : 设定函数处理

如果外键的那条数据被删除了。那么将会获取SET函数中的值(value)来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法)。
如果是可以调用的对象,那么会将这个对象调用后的结果作为返回值return返回回去。可以不用指定默认值

6.DO_NOTHING: 不处理(不推荐)

原数据不会有任何操作,也就是说 App1 的某条数据被删除,App2 中的引用还在,其实就是外表的外键还在。 但其实这是一种不推荐的做法,因为如果访问到App2 中的这条数据,用到了 app1 这个字段,就会报错,因为有一条数据被删除了,那么外键表内就有一条数据的外键和主表的外键对应不上,找不到,就报错了。

1
2
# app/models.py
app2 = models.ForeignKey(App1, default='test_nothing', on_delete=models.DO_NOTHING)
坚持原创技术分享,您的支持将鼓励我继续创作!
0%