2016-07-12 37 views
0

我有一個乾淨的方法,讓我RelatedObjectDoesNotExist錯誤在我的模型文件爲什麼會發生 - 由Model.clean()引起的RelatedObjectDoesNotExist錯誤?

@with_author 
class BOMVersion(models.Model): 
    version = IntegerVersionField() 
    name = models.CharField(max_length=200,null=True, blank=True) 
    description = models.TextField(null=True, blank=True) 
    material = models.ForeignKey(Material) 
    creation_time = models.DateTimeField(auto_now_add=True, blank=True) 
    abovequantity = models.DecimalField(max_digits=19, decimal_places=10) 
    belowquantity = models.DecimalField(max_digits=19, decimal_places=10) 
    valid_from = models.DateTimeField(null=True, blank=True) 
    valid_to = models.DateTimeField(null=True, blank=True) 
    is_default = models.BooleanField(default=False) 





    def clean(self): 
     model = self.__class__ 
     if model.objects.filter(material=self.material, is_default=True).count() > 1: 

      raise ValidationError('Material {} has a defaul value already'.format(self.material)) 

UPDATE: 回溯

> Traceback: File 
> "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\handlers\base.py" 
> in get_response 
> 132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\I812624\dev\mrp\lib\site-packages\django\contrib\auth\decorators.py" 
> in _wrapped_view 
> 22.     return view_func(request, *args, **kwargs) File "C:\Users\I812624\dev\mrp\src\item\views\viewsbomversion.py" in 
> bomversion_new 
> 68.   if form.is_valid(): File "C:\Users\I812624\dev\mrp\lib\site-packages\django\forms\forms.py" in 
> is_valid 
> 184.   return self.is_bound and not self.errors File "C:\Users\I812624\dev\mrp\lib\site-packages\django\forms\forms.py" in 
> errors 
> 176.    self.full_clean() File "C:\Users\I812624\dev\mrp\lib\site-packages\django\forms\forms.py" in 
> full_clean 
> 394.   self._post_clean() File "C:\Users\I812624\dev\mrp\lib\site-packages\django\forms\models.py" in 
> _post_clean 
> 430.    self.instance.full_clean(exclude=exclude, validate_unique=False) File 
> "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\models\base.py" 
> in full_clean 
> 1132.    self.clean() File "C:\Users\I812624\dev\mrp\src\item\models.py" in clean 
> 673.   if model.objects.filter(material=self.material, is_default=True).count() > 1: File 
> "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\models\fields\related.py" 
> in __get__ 
> 608.     "%s has no %s." % (self.field.model.__name__, self.field.name) 
> 
> Exception Type: RelatedObjectDoesNotExist at 
> /item/bomversion/new/1/http://127.0.0.1:8000/item/material/material_bomversion_details/1/ 
> Exception Value: BOMVersion has no material. 

它看起來像材料不是由清潔方法中可見。 如果我從驗證中刪除材質並僅保留is_default字段,那就沒關係。

我無言以對爲什麼.....

UPDATE:

問題可能是物質價值不是從表單來的,但在視圖中被填充

if form.is_valid(): 
      bomversion= form.save(commit=False) 
      bomversion.creation_time = timezone.now() 
      bomversion.material = material 
      bomversion.save() 
+0

什麼是is_default?如果你在這裏發佈整個錯誤可能會更好。此外,您可以使用'exists()'而不是'count()> 1' – dietbacon

+0

缺省值爲BooleanField我使用count,因爲每個材質只允許一個默認值,所以此驗證會檢查它。 –

+0

@dietbacon'exists()'在這裏是無效的,因爲作者需要知道是否有*多於* 1,而不是如果它有一個或多個 – trinchet

回答

0

當你可以調用is_valid()的形式來調用模型的乾淨方法。由於您只在調用is_valid()後才分配素材,因此調用self.material時,self.material與任何Material對象都沒有關聯。

而不是檢查乾淨的方法,因爲當您保存表單時,您已經有了材料實例,您可以在調用is_valid()之前引發異常。

if model.objects.filter(material=material, is_default=True).count() > 1: 
    raise ValidationError('Material {} has a default value already'.format(material)) 

保存實例之前調用is_clean()或之前的地方:從清潔拆下檢查,然後添加。

相關問題