我试图通过父对象访问子对象,因为我想根据对象的类型执行不同的操作。我所拥有的是:
#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-utils或django-polymorphic之类的其他应用程序来完成此操作,因为我觉得应该有一个简单的查询操作才能做到这一点。
答案 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类的对象