关于python:Django向后关系

Django backwards relation

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

1
2
3
4
5
class Parent(models.Model):
    ...
class Child(models.Model):
    parent = models.ForeignKey(Course)
    ...

这种关系是一对多(父母一,子女多)现在,我想获取所有父对象及其特定的子对象,并将其作为JSON请求发送。是否可以这样做,而不必首先获取所有的"子"并迭代它们来查找与特定父代相关的子代?我认为对于真正大的数据库来说,这是非常低效的,而且"孩子"不会在其他"家长"中重复出现。

非常感谢你


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

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

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

1
2
3
4
5
class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children')

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

请阅读文档中有关向后跟踪关系以及向后关系如何可能的更多信息。


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

1
Child.objects.filter(parent=my_parent)

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

1
my_parent.child_set.all()


是的,在Django你可以使用:

1
parentInstance.child_set.all()

其中parentInstance是您的Parent数据库中的一个特定的父级。这将以有效的方式返回与之关联的所有子对象。要使其成为JSON响应,可以尝试如下操作:

1
2
3
4
5
6
7
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"

从这里被收养。