django 关联对象总结(keep updating)

django.db.models.field里面的的关系有三种,多对一,一对一,多对多。并且在django中,只需要在两个关系的一边定义连接即可,因为在运行 INSTALL_APP时会自动查找存在的关联.....

多对一 models.ForeignKey

ForeignKey 接受额外的参数集 —— 全都是可选的 —— 它们定义关联关系如何工作的细节。

ForeignKey.limit_choices_to
当这个字段使用模型表单或者Admin 渲染时(默认情况下,查询集中的所有对象都可以使用),为这个字段设置一个可用的选项。它可以是一个字典、一个Q 对象或者一个返回字典或Q对象的可调用对象。

例如:

staff_member = models.ForeignKey(User, limit_choices_to={'is_staff': True})
将使得模型表单 中对应的字段只列出is_staff=True 的Users。 这在Django 的Admin 中也可能有用处。

可调用对象的形式同样非常有用,比如与Python 的datetime模块一起使用来限制选择的时间范围。例如:

def limit_pub_date_choices():
    return {'pub_date__lte': datetime.date.utcnow()}

limit_choices_to = limit_pub_date_choices
如果limit_choices_to 自己本身是或者返回一个用于复杂查询的Q 对象,当字段没有在模型的ModelAdmin中的raw_id_fields 列出时,它将只会影响Admin中的可用的选项。


如果limit_choices_to 使用可调用对象,这个可调用对象将在每次创建一个新表单的时候都调用。它还可能在一个模型校验的时候调用,例如被管理命令或者Admin。Admin 多次构造查询集来验证表单在各种边缘情况下的输入,所以你的可调用对象可能调用多次。  

ForeignKey.related_name

这个名称用于让关联的对象反查到源对象。它还是related_query_name 的默认值(关联的模型进行反向过滤时使用的名称)。完整的解释和示例参见关联对象的文档。注意,当你为抽象模型定义关联关系的时,必须设置这个参数的值;而且当你这么做的时候需要用到一些特殊语法。

如果你不想让Django 创建一个反向关联,请设置related_name 为 '+' 或者以'+' 结尾。 例如,下面这行将确定User 模型将不会有到这个模型的返回关联:

user = models.ForeignKey(User, 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 使用关联对象的主键。

posted @ 2017-09-01 14:22  zijie  阅读(210)  评论(0)    收藏  举报