2013-12-12 88 views
0

假設ModelA和(ModelB1,ModelB2但他們沒有共同的祖先)有許多關係。django,manytomany通過genric foreignkey表?

現在我有一個through modelAtoB模型。

class ModelAToB(Model): 
    model_a = models.ForeignKey(ModelA) 

    content_type=models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    model_b = generic.GenericForeignKey('content_type', 'object_id') 

我看到在Django文檔中使用ManyToManyField,我怎麼能在我的情況下使用它?

class ModelA(Model): 
    pass 

class ModelB(Model): # hum.. there's no ModelB which is a common ancestor of ModelB1, ModelB2 
    model_a_list = models.ManyToManyField(ModelA, through='ModelAtoB') 

回答

0

您不能在您的案例中使用ManyToManyField,但是您的通過模型(ModelAToB)足以存儲關係。

如果你想所有相關ModelBs型號查詢給定ModelAs你會做它在某種程度上是這樣的:

related_b = ModelAToB.objects.filter(model_a=a).prefetch_related('model_b') 
b_instances = [rel.model_b for rel in related_b] 

如果希望所有有關ModelAs給定的ModelB這將是這樣做的話:

from django.contrib.contenttypes.models import ContentType 

model_b_ct = ContentType.objects.get_for_model(b) 

related_a = ModelAToB.objects.filter(object_id=b.id, content_type=model_b_ct) 
a_instance = [rel.model_a for rel in related_a] 

製作一個模型方法可能是一個方便的調整。

class ModelB(Model):: 

    def model_a_list(self): 
     return ModelA.objects.filter(
       modelatob__content_type__app_label=self._meta.app_label, 
       modelatob__content_type__model=self._meta.module_name, 
       modelatob__object_id=self.id 
     ) 

這將返回一個QuerySet,所以你仍然可以做這樣的事情就可以了.Count之間的(),.filter()。