Джанго полиморфное и поле GenericRelation. Как получить все отфильтрованные объекты? - PullRequest
0 голосов
/ 14 июня 2019

models.py

class File(models.Model):--> content_type_id=4
    is_recorded = models.BooleanField(verbose_name=_('is recorded'), default=False)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
    object_id = models.PositiveIntegerField(null=True, blank=True)
    content_object = GenericForeignKey('content_type', 'object_id')


class Parent(PolymorphicModel): --> content_type_id=1
    files = GenericRelation(File)
    field0 = models.CharField(verbose_name=_('field0'), max_length=255, blank=True, null=True)

class Child1(Parent): --> content_type_id=2
    field1 = models.CharField(verbose_name=_('field1'), max_length=255, blank=True, null=True)

class Child2(Parent): --> content_type_id=3
    field2 = models.CharField(verbose_name=_('field2'), max_length=255, blank=True, null=True)

Выполнить запрос 1

Parent.object.all()
[ <Child1:  id 1>,
  <Child2:  id 2>]

SQL 2

SELECT `parent`.`id`,    
   `parent`.`polymorphic_ctype_id`,
   `parent`.`content_type_id`,
   `parent`.`object_id`,
   `parent`.`fiedl0`,
FROM `events_event`

Это хорошо;


Выполнить запрос 2

Child2.object.filter(files__is_recorded=True)
[<Child2:   id 1>]

SQL 2

SELECT DISTINCT `parent`.`id`,
            `parent`.`polymorphic_ctype_id`,
            `parent`.`content_type_id`,
            `parent`.`object_id`,
            `child2`.`parent_ptr_id`,
            `child2`.`field1`,
FROM `child2`
     INNER JOIN `parent` ON (`child2`.`parent_ptr_id` = `parent`.`id`)
     INNER JOIN `parent` T3
                ON (`child2`.`parent_ptr_id` = T3.`object_id` AND (T3.`content_type_id` = 2))
     INNER JOIN `file` ON (T3.`id` = `file`.`id`)

Это хорошо;


Выполнить запрос 3

Parent.object.filter(files__is_recorded=True)
[]

SQL 3

SELECT DISTINCT `parent`.`id`,
            `parent`.`polymorphic_ctype_id`,
            `parent`.`content_type_id`,
            `parent`.`object_id`,
FROM `parent`
     INNER JOIN `file`
                ON (`parent`.`id` = `file`.`object_id` AND (`file`.`content_type_id` = 1))

Это плохо.

Как получить все подобъекты (Child1, Child2), которые имеютfiles__is_recorded = True (без добавления еще одного GenericForeignKey в файловую модель со ссылкой на родительскую модель)?

...