首页 > 解决方案 > 'datetime.date' 对象不可调用

问题描述

我有一个带有date字段和以下方法的模型:

class Pm(models.Model):
    mydate = models.DateField()

    @property
    def due_date(self):
        today = timezone.localtime(timezone.now()).date()
        if self.mydate < today:
            return today
        else:
            return self.mydate

如何myModel.objects.all()根据due_date函数的返回进行排序?我试过了:

qs = sorted(Pm.objects.all(), key=lambda a: a.due_date(), reverse=True)

但它返回错误:

'datetime.date' object is not callable

更新 基于萨米的建议:

@staticmethod
    def due_date(obj):
        today = timezone.localtime(timezone.now()).date()
        if obj.pm_date < today:
            return today
        else:
            return obj.pm_date

qs = sorted(Pm.objects.all(), key=Pm.due_date, reverse=True)

似乎工作,除了它返回一个列表而不是一个查询集。

我应该使用什么方法来获取查询集?

标签: pythondjango

解决方案


我认为您需要使您的方法due_date成为静态方法或将其与模型分开,方法获取obj并返回日期,然后在排序方法中使用此方法。像这样的东西

def due_date(obj):
        today = timezone.localtime(timezone.now()).date()
        if obj.date < today:
            return today
        else:
            return obj.date
qs = sorted(Pm.objects.all(), key=due_date, reverse=True)

如果您在 Model 类中将此方法设为静态,则将其用作:

qs = sorted(Pm.objects.all(), key=PM.due_date, reverse=True)

否则,您需要注释然后使用查询集的 order_by。 带有条件表达式的注释 F 表达式

像这样的东西(它可能不是确切的解决方案,但你需要做这样的事情):

from django.db.models import Case, DateField, Value, When
qs = Pm.objects.annotate(
    due_date=Case(
        When(date__lt=today, then=Value(today)),
        default=F("date"),
        output_field=DateField(),
    )
)
qs.order_by("due_date")

推荐阅读