2012-03-24 78 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