Django向后关系

时间:2014-04-13 17:55:14

标签: python django

我正在为应用程序设置webservices,我有以下模型:

class Parent(models.Model):
    ...
class Child(models.Model):
    parent = models.ForeignKey(Course)
    ...

关系是一对多(1个父母,多个孩子) 现在,我想获取具有其特定Child的所有Parent对象,并将其作为JSON请求发送。是否有可能这样做而不必先得到所有" Childs"并迭代他们寻找与特定父母相关的? 我认为对于真正的大型数据库,以及" Childs"不会在其他"父母"

中重复

非常感谢

3 个答案:

答案 0 :(得分:11)

Django中的每个关系都会自动将其反向关系添加到模型中。如果ForeignKeyManyToManyField该关系包含多个对象。在这种情况下,默认属性名称设置为<model>_set,因此在这种情况下child_set。这是一个管理员,可以这样使用,例如,迭代所有孩子:

for child in parent.child_set.all():
    do_something()

您还可以使用related_name属性指定用于反向关系的属性名称:

class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children')

for child in parent.children.filter(some_field=True):
    do_something()

following relations backwardshow are backward relationships possible的文档中阅读更多内容。

答案 1 :(得分:2)

为什么需要迭代?即使Django没有为您提供特殊的向后语法,您也可以这样做:

Child.objects.filter(parent=my_parent)

但是作为一个粗略的谷歌,你的问题的标题会显示,有一个特殊的后向关系语法:

my_parent.child_set.all()

答案 2 :(得分:0)

是的,在django中你可以使用:

parentInstance.child_set.all()

其中parentInstanceParent数据库中的一个特定父级。这将以有效的方式返回与其关联的所有Child对象。要使它成为JSON响应,您可以尝试这样的事情:

import json

from django.http import HttpResponse

response_data = {}
response_data[str(parentInstance)] = parentInstance.child_set.all()
return HttpResponse(json.dumps(response_data), content_type="application/json"

here采用。