django 模型关系

2016/6/8 posted in  python

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
不采取任何动作。