将模型字段值另存为其他字段的默认值

时间:2018-07-22 14:31:24

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

这是我的models.py文件中的相关代码

class PhotoManager(models.Model):
     id = models.AutoField(primary_key=True)
     def model_instance_id(self):
         return self.id
     index = models.PositiveIntegerField(default = model_instance_id, blank=True, unique = False)

我要做的是将model id字段值保存到索引字段中(以便稍后通过对Django Rest Framework的AJAX调用安全地对其进行编辑)。据我了解,将模型字段值保存到另一个字段的唯一正确选择是将默认值设置为函数。保存模型实例时出现错误:

  

TypeError:model_instance_id()缺少1个必需的位置参数:“ self”

无论如何,我不知道如何在提到的函数中引用ID字段。

我尝试使用save方法,但是它什么也没做

def save(self, *args, **kwargs):
     if not self.index:
         self.index = self.id
     super().save(*args, **kwargs)

2 个答案:

答案 0 :(得分:2)

问题是您在保存实例之前先设置了index ,这时新模型实例还没有id。因此,您可以执行两个.save():一个在获取id之前执行,另一个对save新索引执行。

def save(self, *args, **kwargs):
    if self.id is None:
        super().save(*args, **kwargs)
    if self.index is None:
        self.index = self.id
        super().save(*args, **kwargs)

话虽如此,但这仍然不是一个好主意:有多种方法来规避.save(..)方法,例如在更新特定字段时等。

因此,我建议您创建一个_index列,而不是NULL,然后编写一个@property来处理index为{{ 1}}:

NULL

答案 1 :(得分:0)

调用函数时,应使用括号

index = models.PositiveIntegerField(default = model_instance_id(), blank=True, unique = False)