2012-09-28 81 views
0

我有三个型号:如何获取相关对象?

class Model_1(models.Model): 
    ... 

class Model_2(models.Model): 
    m1 = models.ManyToManyField(Model_1,... 
    ... 

class Model_3(models.Model): 
    m2 = models.ManyToManyField(Model_2,... 
    ... 

,我得到Model_1的对象:

object = Model_1.objects.get(id=my_id) 

如何从对象相关Model_3?

回答

1

如果您没有问题2个查询,

m2_objects = objects.model_2_set.all() 
m3_objects = Model_3.objects.filter(m2__in=m2_objects) 
0

ManyToMany给你一个不是一个对象。 你可以得到的Model_3对象,如model_2_set到任何related_name您提供此

>>> object = Model_1.objects.get(id=my_id) 
>>> for o2 in object.model_2_set.all(): 
>>>  for o3 in o2.model_3_set.all(): 
>>>   print o3 # o3 is one of Model_3 object 

变化。

0

这里是prefetch_related,做只有3个查询的解决方案。

object = Model_1.objects.get(id=my_id) # 1 query 
m2_set = object.model2_set.prefetch_related('model3_set') # 2 queries for model 2 and 3 
for o3 in chain(*(m2.m3_set.all() for m2 in m2_set)): # chaning o3 sets (no query) 
    print o3 # probably no query 

来源: prefetch_related:https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related 链:http://docs.python.org/release/2.6.5/library/itertools.html#itertools.chain

0
Model_3.objects.filter(m2__m1=object) 

这不是直观的,但如果该值是一组相关对象中的__exact过滤器相匹配。

编辑:这是shell的输出,用于踢腿。

>>> from myapp.models import * 
>>> m1 = Model_1.objects.create(name='it') 
>>> m2 = Model_2.objects.create() 
>>> m3 = Model_3.objects.create() 
>>> 
>>> m1.model_2_set.add(m2) 
>>> m2.model_3_set.add(m3) 
>>> Model_3.objects.filter(m2__m1=m1).count() 
1