Django: как исключить определенные результаты на основе значений других строк в таблице?
У меня есть модель Django под названием ProductPrice с пользовательским QuerySet в качестве менеджера:
class ProductPriceQuerySet(models.QuerySet):
def available(self, user):
Group = apps.get_model("memberships", "Group")
q = Q(title="Non-Member")
if user.is_authenticated and user.member:
q = q | Q(membership__members__user=user)
return self.annotate(
available=Case(
When(
membership_group__in=Group.objects.filter(q),
then=True,
),
default=False,
)
).order_by("stock", "-price")
class ProductPrice(models.Model):
stock = models.ForeignKey(
StockManagement, on_delete=models.CASCADE, related_name="prices"
)
membership_group = models.ForeignKey(
"memberships.Group", null=False, blank=False, on_delete=models.PROTECT
)
price = models.FloatField()
objects = ProductPriceQuerySet.as_manager()
Это работает для отображения доступных цен на лицевой стороне. Но я хочу исключить более высокую цену для нечленов, если пользователь может купить товар по более низкой цене.
Каким образом лучше всего это сделать? Я думал о другой аннотации, например:
display=Case(
When(
membership_group__in=Group.objects.filter(q)
& ProductPrice.objects.filter(
price__lt=F("price"),
),
then=True,
),
default=False,
)
Но это дает ошибку Cannot combine queries on two different base models.
Есть ли возможность сделать это с помощью SubQuery? Или это будет слишком дорого?