如何在 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() 中获取模型的实例的主要内容,如果未能解决你的问题,请参考以下文章