Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Distinct-over-Django-manytomy关系从原始SQL进行Django查询_Python_Sql_Django_Distinct - Fatal编程技术网

Python 使用Distinct-over-Django-manytomy关系从原始SQL进行Django查询

Python 使用Distinct-over-Django-manytomy关系从原始SQL进行Django查询,python,sql,django,distinct,Python,Sql,Django,Distinct,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.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有效的解决方案

有什么想法吗?

您可以使用以下方法进行筛选:

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

因此,对于给定的示例数据,它将返回中国和葡萄牙的标志。

我不知道如何在Django中创建交叉连接(这就是您在sql中所做的…)
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