Это оставляет меня на некоторое время сбитым с толку.
У меня установлены отношения ManyToMany с помощью таблицы, как показано ниже:
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
, если обе вещи не были упомянуты в одном запросе фильтра?
Я что-то здесь упускаю?
Дайте мне знать, нужна ли какая-либо дополнительная информация.