我有模特:
class Z(models.Model):
name = ...
class B(model.Model):
something = model...
other = models.ForeignKey(Z)
class A(models.Model):
date = model.DateTimeField()
objs_b = models.ManyToManyField(B)
def get_obj_b(self,z_id):
self.obj_b = self.objs_b.get(other=z_id)
和查询:
qs = A.objects.filter(...)
但如果我想让对象B与A相关,我必须调用get_obj_b:
for item in gs:
item.get_obj_b(my_known_z_id)
生成了很多查询。怎么做到这么简单?我无法改变模型,一般我必须使用过滤器(而不是我自己的经理)功能。
答案 0 :(得分:1)
如果你使用的是Django 1.4,我建议你像这样使用prefetch_related:
A.objects.all().prefetch_related('objs_b__other')
这会将查询次数最小化为2:一个用于模型A,一个用于'objs_b'加入'其他'
您可以将它与pastylegs建议的过滤器结合使用:
A.objects.filter(objs_b__other__id=z_id).prefetch_related('objs_b__other')
有关详细信息,请参阅:https://docs.djangoproject.com/en/1.4/ref/models/querysets/#prefetch-related