Django通过父对象获取子对象

时间:2019-03-13 08:43:24

标签: python django django-models

我试图通过父对象访问子对象,因为我想根据对象的类型执行不同的操作。我所拥有的是:

#models.py
class A(models.Model):
    ...

class B(A):
    field1 = models.CharField(...)
    ...

class C(A):
    field2 = models.IntegerField(...)

我可以执行2个for循环并完成我想要的:

for obj in B.objects.all():
    if field1 == 'something':
        do some operation

for obj in C.objects.all():
    if field2 == 5:
        do some other operation

但是我在想,是否不可能使用1 for循环来执行此操作并通过父级访问子级?

for obj in A.objects.all():
    if obj.b and obj.b.field1 == 'something':
        do some operation
    elif obj.c and obj.c.field2 == 5:
        do some other operation

我还认为select_related可以解决问题,但是它说它仅适用于ForeignKey

此外,我希望能够不使用django-model-utilsdjango-polymorphic之类的其他应用程序来完成此操作,因为我觉得应该有一个简单的查询操作才能做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以像在最后的for循环中那样从父级获取子级对象,但是您还需要像下面这样检查父级的子级对象:

for obj in A.objects.all():
    try:
        if obj.b.field1 == 'something':
            do some operation
    except ObjectDoesNotExist:
        # obj does not have a child of class B

    try:
        if obj.c.field2 == 5:
            do some other operation
    except ObjectDoesNotExist:
        # obj does not have a child of class C

您还可以使用Q对象将其合并为一个查询:

A.objects.filter(Q(b__isnull=False, b__field1='something') | Q(c__isnull=False, c__field2=5))

这将返回A类的对象