Сделайте запрос Django из raw SQL с отчетливым отношением Django ManyToMany - PullRequest
0 голосов
/ 06 марта 2020

models.py

class FlagsModel(models.Model):
    name = models.CharField(max_length=64, verbose_name='Flag')

class ColorsModel(models.Model):
    name = models.CharField(max_length=64, verbose_name='Color')

class RelationModel(models.Model):
    flag = models.ForeignKey(FlagsModel, null=True, on_delete=models.SET_NULL)
    color = models.ForeignKey(ColorsModel, null=True, on_delete=models.SET_NULL)

SQL Таблицы:

FlagsModel
+----+--------------+
| id | name         |
+----+--------------+
|  1 | brazil       |
|  2 | canada       |
|  3 | china        |
|  4 | portugal     |
+----+--------------+

ColorsModel
+----+--------------+
| id | name         |
+----+--------------+
|  1 | red          |
|  2 | yellow       |
|  3 | green        |
+----+--------------+

RelationModel
+----+---------+----------+
| id | flag_id | color_id |
+----+---------+----------+
|  1 | 1       | 3        |
|  2 | 1       | 2        |
|  4 | 2       | 1        |
|  5 | 3       | 1        |
|  6 | 3       | 2        |
|  7 | 4       | 1        |
|  8 | 4       | 2        |
|  9 | 4       | 3        |
+----+---------+----------+

Я ищу запрос, который выбирает каждый флаг, содержащий цвета "желтый" и "красный"

в необработанном виде SQL я могу сделать что-то вроде этого:

SELECT DISTINCT a1.flag_id from relationmodel a1, relationmodel a2 where a1.color_id=2 AND a2.color_id=1

но я не нашел решения, которое будет работать в django

какие-нибудь идеи?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете отфильтровать с помощью:

FlagModel.objects.filter(
    <b>relationmodel__color_id=1</b>
).filter(
    <b>relationmodel__color_id=2</b>
)

Таким образом, будет создан запрос, который выглядит следующим образом:

SELECT flagmodel.*
FROM flag
INNER JOIN relationmodel r1 ON r1.flag_id = flag.id
INNER JOIN relationmodel r2 ON r2.flag_id = flag.id
WHERE r1.flag_id = 1 AND r2.flag_id = 2

Таким образом, для данных данных примера он вернет флаги Китая и Португалия.

...