【问题标题】:Make a Django query from raw SQL with Distinct over Django ManyToMany Relation通过 Django ManyToMany Relation 使用 Distinct 从原始 SQL 进行 Django 查询
【发布时间】:2020-03-06 19:36:29
【问题描述】:

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 中使用的解决方案

有什么想法吗?

【问题讨论】:

  • 我不知道在 Django 中创建交叉连接的任何方法(这就是您在 sql 中所做的...)

标签: python sql django distinct


【解决方案1】:

你可以过滤:

FlagModel.objects.filter(
    relationmodel__color_id=1
).filter(
    relationmodel__color_id=2
)

因此,这将创建一个如下所示的查询:

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

所以对于给定的样本数据,它将返回中国和葡萄牙的国旗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 2015-11-21
    • 2012-03-16
    • 2019-02-18
    • 2019-08-18
    • 2016-03-01
    • 2019-08-05
    • 2018-05-15
    相关资源
    最近更新 更多