Есть такая вот модель, которая ссылается на другие модели.
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 не дает, ну кроме ключей. Если я не прав, то подскажите с документацией.