python - '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)
似乎工作,除了它返回一个列表而不是一个查询集。
我应该使用什么方法来获取查询集?
解决方案
我认为您需要使您的方法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")
推荐阅读
- reactjs - 输入问题 URLSearchParams
- apigee - 如何重新设置 apigee 学习边缘教程的组织?
- typescript - 如何在 observable 内部有条件地订阅,等待响应并返回完整结果?
- docker - 从 docker 中运行的 .NET Core 应用程序连接到本地 SQL Server
- xamarin - 嵌套选项卡视图未绑定到单独的 ViewModel
- java - 在自动生成的 Excel 文件中添加颜色
- php - 未经身份验证的子页面的PHP Laravel保护路由
- wso2is - 如何在 wso2 api 管理器中添加额外的标题和值?
- php - 在 symfony 4 中使用 pdo 会话时,有什么方法可以将自定义列添加到会话表中?
- nsis - 如何限制 NSIS 中的文本框字符数