通过 Django ManyToMany 关系从原始 SQL 进行 Django 查询
Make a Django query from raw SQL with Distinct over Django ManyToMany Relation
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 |
+----+---------+----------+
我现在正在寻找一个查询,它选择包含颜色 "yellow" 和 "red"
的每个标志
在原始 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(
<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
所以对于给定的样本数据,它将return中国和葡萄牙的国旗。
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 |
+----+---------+----------+
我现在正在寻找一个查询,它选择包含颜色 "yellow" 和 "red"
的每个标志在原始 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(
<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
所以对于给定的样本数据,它将return中国和葡萄牙的国旗。