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? Или это будет слишком дорого?

Вернуться на верх