LINUX.ORG.RU

Django ORM и ContentType


0

1

Есть такая вот модель, которая ссылается на другие модели.

class ContentObject(models.Model):

    content_id = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType, related_name='statistics_contentobject_set')
    content_object = generic.GenericForeignKey('content_type', 'content_id')
    count = models.PositiveIntegerField(default=0)

    objects = ContentObjectManager()

    class Meta:
        unique_together = ('content_id', 'content_type')

class Month(models.Model):

    content_object = models.ForeignKey(ContentObject)
    date = models.DateField()
    count = models.PositiveIntegerField(default=0)

    class Meta:
        unique_together = ('content_object', 'date')

content_type - тип модели, на которое ссылается, content_id - id в той моделе.

Потом берутся id моделей:

   content_types = ContentType.objects.filter(
         Q(app_label='blogs', model='blog') |
         Q(app_label='videos', model='video'))
    content_type_ids = [ct['id'] for ct in content_types.values('id')]

Затем делается запрос к БД:

   queryset = Month.objects.filter(
                         content_object__content_type__in = content_type_ids,
                         ).select_related('content_object', 'content_object__content_type')

И в результате получается список объектов из моделей Blog и Video. У этих моделей есть поле rubric, по которому нужно фильтровать данные.

Так вот, как можно сделать фильтрацию?

   queryset = Month.objects.filter(
                         content_object__content_type__in = content_type_ids,
                        content_object__content_object__rubric = 2,
                         ).select_related('content_object', 'content_object__content_type')

Естественно не работает. Как это сделать вообще не представляю. Все это сделано до меня и переделывать заново не могу, т.к. уйдет много времени. Запрос к БД получается очень огромным. Я не знаю есть ли какой-то способ привязки к Foreign ключам в PostgreSQL, в MySQL он ничего умного при SELECT не дает, ну кроме ключей. Если я не прав, то подскажите с документацией.

★★★★★
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.