Field常用参数
null
- 默认为
False
。如果设置为True
,Djangoi
会在映射表的时候指定是否为空。 - 在使用字符串相关的
Field
(比如CharField
和TextField
),官方推荐不要使用该参数,即默认False
Django
在处理字符串相关的Field
时,即使这个Field
的null= False
,如果你没有给这个Field
传递任何值,Django
也会使用一个空的字符串""
来作为默认值存储进去。- 如果此时再使用
null=True
,Django
就会产生两种空值的情形(NULL或者空字符串)。 - 如果想要在表单验证的时候允许这个字符串为空,那么建议使用
blank=True
。 - 如果你的
Field
是BooleanField
,则对应的可空字段为NullBooleanfield
- 如果此时再使用
blank
- 标识这个字段在表单验证的时候是否可以为空。 默认
False
- 和
null
的区别null
是纯数据库级别blank
是表单验证级别
db_column
- 字段在数据库中的名字。如果没有设置这个属性,那么将会使用模型中属性的名字
default
- 默认值。可以为一个值或者一个函数(不是函数调用!)。但是不支持
lambda
表达式。并且不支持列表/字典/集合等可变的数据结构
primary_key
- 是否为主键。默认是
False
unique
- 在表中这个字段的值是否唯一。一般是设置手机号码/邮箱等。
模型的Meta
设置
- 对于模型级别的配置。可以在模型中定义一个类,叫做
Meta
。然后再这里类中添加一些类属性来控制模型的作用。
db_table
- 这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。
ordering
设置在提取数据的排列方式。
class Book(models.MODEL):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
def __str__(self):
return "<Book:id:'%s' name:'%s'>" % (id, name)
class Meta:
db_table = "book_table" # 映射到数据的表名就是book_table
ordering = ['-id'] # 列表 形式,-号表示倒序
外键
- 在
MySQL
中,表有两种引擎,一种是InnoDB
,另外一种是myisam
。如果使用的是InnoDB
引擎,是支持外键约束的。外键的存在使得ORM
框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在Django
中的使用。 - 类定义为
class ForeignKey(to,on_delete,**options)
。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理。 - 这里以一个实际案例来说明。比如有一个
User
和一个Article
两个模型。一个User
可以发表多篇文章,一个Article
只能有一个Author
,并且通过外键进行引用。那么相关的示例代码如下: ```python class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100)
class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField()
author = models.ForeignKey("User",on_delete=models.CASCADE)
- 以上使用`ForeignKey`来定义模型之间的关系。即在`article`的实例中可以通过`author`属性来操作对应的`User`模型。示例代码如下:
```python
article = Article(title='abc',content='123')
author = User(username='张三',password='111111')
article.author = author
article.save()
# 修改article.author上的值
article.author.username = '李四'
article.save()
- 为什么使用了
ForeignKey
后,就能通过author
访问到对应的user
对象呢。因此在底层,Django
为Article
表添加了一个属性名_id
的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过article.author
访问的时候,实际上是先通过author_id
找到对应的数据,然后再提取User
表中的这条数据,形成一个模型。 - 如果想要引用另外一个
app
的模型,那么应该在传递to
参数的时候,使用app.model_name
进行指定。以上例为例,如果User
和Article
不是在同一个app
中,User
在appuser
中,那么在引用的就应该这样写: ```pythonUser模型在user这个app中
class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100)
Article模型在article这个app中
class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField()
author = models.ForeignKey("user.User",on_delete=models.CASCADE)
- 如果模型的外键引用的是本身自己这个模型,那么`to`参数可以为`'self'`,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:
```python
class Comment(models.Model):
content = models.TextField()
origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
# 或者
# origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)
外键删除操作
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete
来指定。可以指定的类型如下:
CASCADE
:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。PROTECT
:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。SET_NULL
:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。SET_DEFAULT
:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。SET()
:如果外键的那条数据被删除了。那么将会获取SET
函数中的值来作为这个外键的值。SET
函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。DO_NOTHING
:不采取任何行为。一切全看数据库级别的约束。
以上这些选项只是Django级别的,数据级别依旧是RESTRICT!