You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django日期比较报错:strptime参数应为字符串而非DeferredAttribute求助

问题解决方案

核心错误分析

报错strptime() argument 1 must be str, not DeferredAttribute的原因有两个:

  • 错误引用了类属性Profile.biometry_date而非实例属性self.biometry_date
  • biometry_date是Django的DateField,本身已经是date类型对象,不需要用strptime做字符串转日期的操作

另外代码里还存在两个潜在问题:

  • 没有处理biometry_date为null的情况,会触发空值报错
  • 模板里混淆了customer和profile变量,导致渲染异常

修正后的模型代码

from django.db import models
from datetime import datetime, timedelta

class Customer(models.Model):  # 类名遵循PEP8规范,首字母大写
    first_name = models.CharField(max_length=255, default='')
    last_name = models.CharField(max_length=255, default='')
    biometry_date = models.DateField(blank=True, null=True)  # DateField不需要default='',null=True即可

    @property
    def is_due(self):
        if not self.biometry_date:  # 处理空值情况
            return False
        today = datetime.now().date()
        reminder_delta = timedelta(days=10)  # 匹配需求的提前10天提醒
        # 计算距离预约日期的天数,小于等于10天则返回True
        return (self.biometry_date - today) <= reminder_delta

修正后的模板代码

{% if customer.is_due %}
<td class="text-right">
    <span class="badge badge-danger">{{ customer.biometry_date }}</span>
</td>
{% else %}
<td>{{ customer.biometry_date }}</td>
{% endif %}

关键修正点说明

  1. 实例属性引用:将Profile.biometry_date改为self.biometry_date,确保访问当前实例的日期字段
  2. 移除不必要的类型转换:直接使用self.biometry_date(DateField返回的是date对象)和today做差值计算
  3. 空值处理:增加if not self.biometry_date判断,避免空值引发的AttributeError
  4. 变量统一:模板里将profile.biometry_date改为customer.biometry_date,和上下文变量保持一致
  5. 匹配业务需求:将原代码的30天时间差改为需求的10天,符合提前提醒的业务逻辑

内容的提问来源于stack exchange,提问作者St JC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:55:22