【问题标题】:Setting Djando field default value based on another field根据另一个字段设置 Django 字段默认值
【发布时间】:2021-06-22 19:00:16
【问题描述】:

我正在创建一个 Django 模型,其中:

  1. expirationTimeStamp 字段的默认值基于 creationTimeStamp

  2. isLive 布尔字段值是基于 expireTimeStamp

我编写了以下函数 expirationTimeCalculationpostLiveStatus 并将它们作为默认值分配给字段,但我遇到了错误。我也尝试通过属性(函数)分配给各个字段,但仍然出现错误。

我需要实现的功能之一是用户可以发送自定义的 expireTimeStamp 以及将覆盖默认值,因此,我认为属性(函数)分配不适合 expireTimeStamp 字段。

还有其他方法可以根据 creationTimeStamp 字段设置 expireTimeStamp 字段值吗?

感谢任何反馈!

 class Posts(models.Model):
    
    def expirationTimeCalculation(self):
        EXPIRATION_DURATION = 86400 #time in seconds
        expirationTime = self.creationTimestamp + timedelta(seconds = EXPIRATION_DURATION)
        return expirationTime

    def postLiveStatus(self):
        return (self.expirationTimestamp > timezone.now)


    message = models.TextField() 
    creationTimestamp = models.DateTimeField(default=timezone.now)
    expirationTimestamp = models.DateTimeField(default=expirationTimeCalculation)
    isLive = models.BooleanField(default=postLiveStatus)

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    类似的回答问题。我附上官方文档以及已回答问题的链接。

    模特确实有“自我”!只是您试图将模型类的属性定义为依赖于模型实例;这是不可能的,因为在您定义类及其属性之前,该实例不(也不能)存在。

    为了得到你想要的效果,重写模型类的 save() 方法。对实例进行必要的更改,然后调用超类的方法进行实际保存。这是一个简单的例子。

    def save(self, *args, **kwargs):
        if not self.subject_init:
            self.subject_init = self.subject_initials()
        super(Subject, self).save(*args, **kwargs)
    

    Model Overriding Documentation

    Django Model Field Default Based Off Another Field

    【讨论】:

    • 非常感谢,您的回答帮我节省了很多时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多