如何在 clean() 中获取模型的实例

Posted

技术标签:

【中文标题】如何在 clean() 中获取模型的实例【英文标题】:How to get the instance of the model in clean() 【发布时间】:2017-07-22 03:01:41 【问题描述】:

我已经覆盖了 clean() 方法以在我的模型中执行自定义验证。有没有办法获取正在保存的模型实例?

class Consumption(models.Model):
    storage = models.ForeignKey(Storage, related_name='consumption')
    timestamp = UnixDateTimeField()
    consumption = models.BigIntegerField(help_text='Consumption in Bytes')

    def clean(self):
        if self.storage_type == PRIMARY:
            if Storage.objects.filter(company=self.company, storage_type=PRIMARY).exists():
                raise ValidationError('storage_type': 'Already exists a Primary storage')

当我修改与消费相关的存储时,它会引发 ValidationError。所以我想像这样改进过滤器:

Storage.objects.exclude(pk=self.instance.pk).filter(...)

我可以从哪里获取实例?

【问题讨论】:

你可以使用pre_save,例如是这样的答案***.com/a/6462188/6396981 @SancaKembang 这有什么帮助? OP 正在询问如何在 clean 方法中获取他的模型实例。 【参考方案1】:

与所有python实例方法一样,当前实例是第一个位置参数,规范命名为self

class MyModel(models.Model):
    # fields etc here

    def clean(self):
       print("current instance is ".format(self))

编辑:

由于您澄清了问题,看来您想要的是当前实例的相关storage,而不是Consumption 实例本身(即self)。很简单,因为当前实例是self,所以相关的storage 实例是self.storage

【讨论】:

我在问题中添加了更多信息;)

以上是关于如何在 clean() 中获取模型的实例的主要内容,如果未能解决你的问题,请参考以下文章

java 父类如何在运行期动态获取子类类名

了解快速排序算法如何在 VBA 中重现

方法如何在 Ruby 中使用哈希参数?

RDD take()方法如何在内部工作?

Django 表单验证、clean() 和文件上传

如何在graphene-python DjangoObjectType中获取模型的当前实例