检查多对多关系或 属性
Checking for many-to-many relation OR a property
如何检查是否存在多对多关系或是否满足另一个 属性?当我尝试查询时,它 return 查询了一些行两次!
给定一个模型
from django.db import models
class Plug(models.Model):
name = models.CharField(primary_key=True, max_length=99)
class Widget(models.Model):
name = models.CharField(primary_key=True, max_length=99)
shiny = models.BooleanField()
compatible = models.ManyToManyField(Plug)
我的数据库中有以下项目:
from django.db.models import Q
schuko = Plug.objects.create(name='F')
uk = Plug.objects.create(name='G')
Widget.objects.create(name='microwave', shiny=True).compatible.set([uk])
Widget.objects.create(name='oven', shiny=False).compatible.set([uk])
Widget.objects.create(name='pc', shiny=True).compatible.set([uk, schuko])
现在我想要所有闪亮 and/or 与 Schuko 兼容的小部件的名称:
shiny_or_schuko = sorted(
Widget.objects.filter(Q(shiny=True) | Q(compatible=schuko))
.values_list('name', flat=True))
但令我惊讶的是,这并没有 return ['microwave', 'pc']
。相反,'pc'
被列出了两次,即 shiny_or_schuko
是 ['microwave', 'pc', 'pc']
.
这是 Django 的错误吗?如果没有,我如何设置只获得一次 'pc'
的查询?
Is this a Django bug?
否。您只需使用多对多 table 执行 LEFT OUTER JOIN
。如果两个或多个相关对象匹配,它将被多次包含。这可能是需要的行为,例如,如果您向从这些相关对象获取值的元素添加额外的注释。
您只能使用 .distinct()
[Django-doc] 到 return distinct 个元素:
Widget.objects.filter(
Q(shiny=True) | Q(compatible=schuko)
).values_list('name', flat=True)<b>.distinct()</b>
如何检查是否存在多对多关系或是否满足另一个 属性?当我尝试查询时,它 return 查询了一些行两次!
给定一个模型
from django.db import models
class Plug(models.Model):
name = models.CharField(primary_key=True, max_length=99)
class Widget(models.Model):
name = models.CharField(primary_key=True, max_length=99)
shiny = models.BooleanField()
compatible = models.ManyToManyField(Plug)
我的数据库中有以下项目:
from django.db.models import Q
schuko = Plug.objects.create(name='F')
uk = Plug.objects.create(name='G')
Widget.objects.create(name='microwave', shiny=True).compatible.set([uk])
Widget.objects.create(name='oven', shiny=False).compatible.set([uk])
Widget.objects.create(name='pc', shiny=True).compatible.set([uk, schuko])
现在我想要所有闪亮 and/or 与 Schuko 兼容的小部件的名称:
shiny_or_schuko = sorted(
Widget.objects.filter(Q(shiny=True) | Q(compatible=schuko))
.values_list('name', flat=True))
但令我惊讶的是,这并没有 return ['microwave', 'pc']
。相反,'pc'
被列出了两次,即 shiny_or_schuko
是 ['microwave', 'pc', 'pc']
.
这是 Django 的错误吗?如果没有,我如何设置只获得一次 'pc'
的查询?
Is this a Django bug?
否。您只需使用多对多 table 执行 LEFT OUTER JOIN
。如果两个或多个相关对象匹配,它将被多次包含。这可能是需要的行为,例如,如果您向从这些相关对象获取值的元素添加额外的注释。
您只能使用 .distinct()
[Django-doc] 到 return distinct 个元素:
Widget.objects.filter(
Q(shiny=True) | Q(compatible=schuko)
).values_list('name', flat=True)<b>.distinct()</b>