Фильтр запроса типа контента по значению объекта - PullRequest
0 голосов
/ 13 мая 2018

Я использую Django 2.0.0 и имею следующую структуру базы данных:

class Project(models.Model):
    name = models.CharField(_(u'Name'), max_length=32)

class Domain(models.Model):
    project = models.ForeignKey('projects.Project', on_delete=models.CASCADE)
    tool_result = GenericRelation('projects.ToolResult')

class ToolResult(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

Я хочу получить все фильтры ToolResults на основе проекта объекта content_type.

ToolResult.objects.filter(content_type=ContentType.objects.get_for_model(Domain), content_object__project__in=[1, 2])

Я пытался так, но это не работает. У меня есть около 500 тыс. Записей доменов и 3 тыс. Записей ToolResults. Это делает невозможным повторение объектов. Как я могу сделать это эффективным?

1 Ответ

0 голосов
/ 13 мая 2018

Сначала мы можем запросить список Domain s, для которого проект находится в [1, 2]:

domain_ids = (Domain.objects.filter(project__in=[1, 2])
                            .values_list('id', flat=True))

, теперь во втором проходе мы можем фильтровать как content_type, так и object_id:

ToolResult.objects.filter(content_type=ContentType.objects.get_for_model(Domain),
                          object_id__in=domain_ids)
...