【发布时间】:2018-11-14 02:05:57
【问题描述】:
这让我困惑了一段时间。
我通过如下表建立了多对多关系:
class Coupon(TimeStampedUUIDModel):
venue = models.ManyToManyField('venues.Venue', through='VenueCouponConfig', related_name='coupons')
class Meta:
verbose_name = _('Coupon')
verbose_name_plural = _('Coupons')
ordering = ('-created_at', )
class VenueCouponConfig(UUIDModel):
venue = models.ForeignKey(
'venues.Venue', null=True, blank=True, on_delete=models.SET_NULL
)
coupon = models.ForeignKey(
'Coupon', null=True, blank=True, on_delete=models.SET_NULL
)
is_activated = models.BooleanField(_('Activate Coupon'), null=False, blank=True)
基本上,我想让优惠券与多个场所相关联,因此我通过表格创建了每个场所的 is_activated 标志,用于描述是否为场所激活了特定优惠券。
现在,我有这个 API,它列出了特定地点的所有优惠券,例如:
...
venue = get_object_or_404(self.queryset, pk=pk)
qs = Coupon.objects.all()
qs = qs.prefetch_related(Prefetch('venuecouponconfig_set'))
qs = qs.filter(venue=venue)
qs = qs.filter(venuecouponconfig__is_activated=True)
qs = qs.order_by('created_at')
...
现在这个 API 的评估给了我很多优惠券。
但如果我像这样附加过滤器:
...
venue = get_object_or_404(self.queryset, pk=pk)
qs = Coupon.objects.all()
qs = qs.prefetch_related(Prefetch('venuecouponconfig_set'))
qs = qs.filter(venue=venue, venuecouponconfig__is_activated=True)
qs = qs.order_by('created_at')
...
这给了我正确的结果,并且优惠券一次出现。
链式过滤器与 ManyToManyField 的工作方式是否不同?除非在单个过滤器查询中提到这两件事,否则它不适合做 AND 吗?
我错过了什么吗?
如果需要更多信息,请告诉我。
【问题讨论】:
-
它们可以像“乘数”一样发挥作用:对于每个“相关对象”,该对象都与相关对象成对被提及。