如何从manytomany获得对象?

时间:2012-03-24 18:33:22

标签: django django-models

我有模特:

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)

生成了很多查询。怎么做到这么简单?我无法改变模型,一般我必须使用过滤器(而不是我自己的经理)功能。

1 个答案:

答案 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