如何在 Django QuerySet 上执行 'SELECT a or b < c FROM Table'?
How to perform 'SELECT a or b < c FROM Table' on Django QuerySet?
我有以下型号:
class DiscountCoupon(models.Model):
is_used = models.BooleanField(default=False)
expiration_date = models.DateField()
def is_available(self):
if self.used or self.expiration_date <= date.today():
return False
return True
我不想调用 is_available
方法遍历 QuerySet,而是想在 QuerySet 中执行此操作以执行得更好,如下所示:
SELECT (used OR (expiration_date < Now())) AS is_available FROM randomapp_discountcoupon;
这可能吗?
您可以使用 Q objects [Django-doc] with Case[Django-doc] 表达式作为
from django.db.models import Q, Case, Value, When
discount_objects = DiscountCoupon.objects.annotate(
is_available=Case(
When(Q(is_used=True) | Q(expiration_date__lt=datetime.date.today()), then=Value(True)),
default=Value(False),
output_field=BooleanField()
)
)
我有以下型号:
class DiscountCoupon(models.Model):
is_used = models.BooleanField(default=False)
expiration_date = models.DateField()
def is_available(self):
if self.used or self.expiration_date <= date.today():
return False
return True
我不想调用 is_available
方法遍历 QuerySet,而是想在 QuerySet 中执行此操作以执行得更好,如下所示:
SELECT (used OR (expiration_date < Now())) AS is_available FROM randomapp_discountcoupon;
这可能吗?
您可以使用 Q objects [Django-doc] with Case[Django-doc] 表达式作为
from django.db.models import Q, Case, Value, When
discount_objects = DiscountCoupon.objects.annotate(
is_available=Case(
When(Q(is_used=True) | Q(expiration_date__lt=datetime.date.today()), then=Value(True)),
default=Value(False),
output_field=BooleanField()
)
)