2013-12-12 2 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') 

Я вижу 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() на нем.

Смежные вопросы