2017-03-02 43 views
0

我已经覆盖了clean()方法在我的模型中执行自定义验证。有什么方法可以获取正在保存的模型的实例吗?如何在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(...) 

从哪里可以拿到实例?

+0

你可以使用['pre_save'](https://docs.djangoproject.com/en/1.10/ref/signals/#pre-save),例如像这样的答案http://stackoverflow.com/a/6462188/6396981 –

+0

@SancaKembang如何帮助? OP正在询问如何让他的模型实例在'clean'方法中。 –

回答

1

正如所有的Python instancemethods往常一样,目前的情况是第一个位置参数,规范地命名为self

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

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

编辑:

既然你澄清这个问题,似乎你想要的是当前实例的相关storage,而不是Consumption实例本身(它是self)。并且很简单,因为当前实例是self,所以相关的storage实例是self.storage

+0

我已经添加了更多信息的问题;) – loar

+0

比较我编辑的答案。 –

相关问题