Я использую django 2.1, python 3.6 и SQL Server 2012 в качестве бэкэнда. У меня есть следующие модели:
class ModelA(models.Model):
name = models.CharField(...)
value = models.PositiveIntegerField(...)
class ModelB(models.Model):
name = models.CharField(...)
values = models.ManyToManyField(ModelA, through='ModelC')
class ModelC(models.Model):
model_a = models.ForeignKey(ModelA, ...)
model_b = models.ForeignKey(ModelB, ...)
info_a = models.CharField(...)
info_b = models.CharField(...)
Как мне выполнить следующий запрос SQL:
SELECT t1.model_a_id AS a_id, t3.value AS a_value
FROM ModelB AS t0
INNER JOIN ModelC t1 ON t1.model_b_id = t0.id
INNER JOIN ModelC t2 ON t2.model_b_id = t0.id
INNER JOIN ModelA t3 ON t3.id = t2.model_a_id
INNER JOIN ModelC t4 ON t4.model_b_id = t0.id
WHERE t1.model_a_id in (1,2) AND t2.model_a_id in (8,9,10,11) AND t4.model_a_id in (21,22)
Что у меня так далеко:
ModelB.objects.filter(values__in=[1,2]).filter(values__in=[8,9,10,11]).filter(values__in=[21,22])
, который производит правильный отфильтрованный QuerySet. Но как я могу получить правильные поля?
Я пытался использовать функцию annotate
, но мне не удалось. Использование Subquery
в django, как описано в документации, приводит к ошибке базы данных, поскольку SQL Server не поддерживает подзапросы в части SELECT
.
Есть какие-нибудь рекомендации? Спасибо!