3

django field constraint

 10 months ago
source link: https://pinghailinfeng.gitee.io/2023/06/09/django-field-constraint/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

django field constraint

2023-06-09

| python

django

| 阅读次数: 3

1.9k

|

2 分钟

Django中关于字段约束

2630620775_828955012.jpg

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中字段也会成为只读的。

  • 如何将创建时间设置为“默认当前”并且可修改
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:级联(常用)
    如果外键对应的那条数据被删除了,那么这条数据也会被删除
    app2 = models.ForeignKey(App1, on_delete=models.CASCADE)

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

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

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

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

4.SET_DEFAULT :设置默认值

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

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

# 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 这个字段,就会报错,因为有一条数据被删除了,那么外键表内就有一条数据的外键和主表的外键对应不上,找不到,就报错了。

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK