Как фильтровать экземпляры Django Model на основе функции, определенной внутри модели?
У меня есть модель для товара, в ней есть функция, которая определяет, находится ли товар еще на аукционе в зависимости от даты окончания.
class Catalogue(models.Model):
name = models.CharField(max_length=256)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
end_date = models.DateTimeField()
def auction_status(self):
now = timezone.now()
return now < self.end_date
В представлении класса я хочу отфильтровать только те экземпляры, где auction_status равен true. Что-то вроде :
class AuctionOverView(ListView):
model = Catalogue
template_name = 'administration/catalogue.html'
def get_queryset(self):
try:
return Catalogue.objects.filter(auction_status=False)
except:
raise Http404()
Но я, очевидно, не могу фильтровать на основе определения функции. Как это можно обойти?
В QuerySet вы не можете фильтровать по свойству или функции модели.
Но в вашем случае вы можете поступить следующим образом:
return Catalogue.objects.filter(end_date__lt=timezone.now())
Вы можете добавить декоратор @property
к вашей функции auction_status
, но это не будет работать с фильтрами Django. Есть некоторые обходные пути, обсуждаемые здесь и здесь .