如何让Django模型中的BooleanField控制关联DateTimeField的取值状态
实现思路
你之前的写法无法生效是因为模型字段定义属于类初始化阶段的逻辑,执行时还不存在具体的实例对象,无法获取到每个实例的ordersent取值,自然不能动态调整字段逻辑。可以通过重写模型save方法实现需求,具体修改如下:
第一步:修改模型字段定义
首先去掉order_sent_time的auto_now属性,改为允许为空:
from django.utils import timezone class Location(models.Model): # 其余原有字段保持不变 orderplaced = models.DateTimeField(auto_now_add=True, blank=True) ordersent = models.BooleanField(default=False) order_sent_time = models.DateTimeField(null=True, blank=True) # 重写save方法实现逻辑控制 def save(self, *args, **kwargs): if self.ordersent: # 当订单标记为已发送时,赋值当前时间 self.order_sent_time = timezone.now() else: # 当订单标记为未发送时,清空时间 self.order_sent_time = None super().save(*args, **kwargs)
第二步:保持admin配置不变
你原有的admin.py配置不需要修改,order_sent_time作为只读字段会自动展示save方法赋值的结果:
class locationAdmin(admin.ModelAdmin): readonly_fields = ["orderplaced", "order_sent_time"] admin.site.register(Location, locationAdmin)
注意事项
- 如果你需要
ordersent第一次设为True后就固定时间不再修改,可以在save方法里加一层判断:if self.ordersent and not self.order_sent_time:再赋值时间即可 - Django默认的admin批量修改操作不会触发模型的
save方法,如果需要批量操作也适配该逻辑,需要额外自定义admin的批量处理动作
内容的提问来源于stack exchange,提问作者The Ultraempoleon
相关产品推荐
相关产品推荐

