2017-03-02 42 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

比較我編輯的答案。 –

相關問題