django模型关系
多对一关系
Django 使用 django.db.models.ForeignKey 定义多对一关系。
几种特殊的外键模式:
- 若要创建一个递归的关联 —— 对象与自己具有多对一的关系 —— 请使用models.ForeignKey('self')。
- 如果你需要关联到一个还没有定义的模型,你可以使用模型的名字而不用模型对象本身。
- 若要引用在其它应用中定义的模型,你可以用带有完整标签名的模型来显式指定。在解析两个应用之间具有相互依赖的导入时,这种引用将会很有帮助。
ForeignKey 会自动创建数据库索引。你可以通过设置db_index 为False 来取消。如果你创建外键是为了一致性而不是用来Join,或者如果你将创建其它索引例如部分或多列索引,你也许想要避免索引的开销。
ForeignKey的字段
ForeignKey.limit_choices_to
当这个字段使用模型表单或者Admin 渲染时(默认情况下,查询集中的所有对象都可以使用),为这个字段设置一个可用的选项。
这个字段可以是boolean型的,进行boolean过滤,或者是一个函数,进行函数的过滤。看下面两个例子:
staff_member = models.ForeignKey(User, limit_choices_to={'is_staff': True})
例子1,将使得模型表单 中对应的字段只列出is_staff=True 的Users。
def limit_pub_date_choices():
return {'pub_date__lte': datetime.date.utcnow()}
limit_choices_to = limit_pub_date_choices
这个例子对选择时间进行限制
如果limit_choices_to
使用可调用对象,这个可调用对象将在每次创建一个新表单的时候都调用。它还可能在一个模型校验的时候调用,例如被管理命令或者Admin。Admin 多次构造查询集来验证表单在各种边缘情况下的输入,所以你的可调用对象可能调用多次。
ForeignKey.related_name
这个名称用于让关联的对象反查到源对象。
如果你不想让Django 创建一个反向关联,请设置related_name 为 '+' 或者以'+' 结尾
ForeignKey.related_query_name
这个名称用于目标模型的反向过滤。如果设置了related_name,则默认为它的值,否则默认值为模型的名称:
# Declare the ForeignKey with related_query_name
class Tag(models.Model):
article = models.ForeignKey(Article, related_name="tags", related_query_name="tag")
name = models.CharField(max_length=255)
# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")
ForeignKey.to_field
关联到的关联对象的字段名称。默认地,Django 使用关联对象的主键。
ForeignKey.db_constraint
控制是否在数据库中为这个外键创建约束。
ForeignKey.on_delete¶
当一个ForeignKey 引用的对象被删除时,Django 默认模拟SQL 的ON DELETE CASCADE 的约束行为,并且删除包含该ForeignKey的对象。
CASCADE
级联删除;默认值。
PROTECT
抛出ProtectedError 以阻止被引用对象的删除,它是django.db.IntegrityError 的一个子类。
SET_NULL
把ForeignKey 设置为null; null 参数为True 时才可以这样做。
SET_DEFAULT
ForeignKey 值设置成它的默认值;此时必须设置ForeignKey 的default 参数。
SET()
设置ForeignKey 为传递给SET() 的值,如果传递的是一个可调用对象,则为调用后的结果。
DO_NOTHING
不采取任何动作。