2012-03-24 79 views
1

我有型号:如何从manytomany中获取对象?

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我必须调用get_obj_b:

for item in gs: 
    item.get_obj_b(my_known_z_id) 

这是产生许多疑问。如何做到这一点简单?我无法更改模型,通常我必须使用过滤器(而不是我自己的管理器)功能。

+0

所以你想得到什么? B对象基于特定的Z.id和A标准? – dm03514 2012-03-24 21:08:31

+0

文章,postlanguages,语言。一篇文章可能有许多语言特定的数据,具体取决于语言。我想在一个查询中获得发布和后期语言(针对当前的lang)数据。模型是他们是什么,我不能改变他们。 – Nips 2012-03-24 21:35:17

回答

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