我有那些类(为清楚起见而简化):
class Entity(models.Model):
adresses = models.ManyToManyField(Address,
related_name='persons',
through='EntityAddress')
class EntityAddress(models.Model):
entity = models.ForeignKey(Entity, on_delete=models.CASCADE,
blank=False, null=False)
address_type = models.ForeignKey(AddressType, models.CASCADE,
blank=False, null=False)
address = models.ForeignKey(Address, on_delete=models.CASCADE,
blank=False, null=False)
class Address(models.Model):
summary = models.CharField(max_length=250, blank=True, null=True)
way = PolygonField(default=None, blank=True, null=True)
class Person(Entity):
user = models.OneToOneField(User, blank=False, null=False,
on_delete=models.CASCADE)
我希望所有Person
的地址都具有“不为空”的way
。
我这样做是这样的:
for p in Person.objects.all():
for e_a in EntityAddress.objects.filter(entity=p,
address__way__isnull=False,):
# do whatever here:
pass
这太慢了! 有没有办法只发出一个请求?
答案 0 :(得分:1)
您可以使用nested in query来做到这一点吗?
类似的东西:
not_null_ea = Entity.objects.filter(addresses__way__isnull=False).values('addresses')
for p in Person.objects.filter(
addresses__in=not_null_ea).prefetch_related('entityaddress_set):
for a_e in p.entityaddress_set:
pass
这样,至少您不会自己遍历Person对象,这确实很慢。
答案 1 :(得分:0)
我没有手头有具体(多表)模型继承的django项目,因此我无法再次检查它是否有效,但是从理论上讲,这应该可以完成您想要的事情:< / p>
Person.objects.filter(adresses__way__isnull=False)
This可能会有所帮助...