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()
什麼是is_default?如果你在這裏發佈整個錯誤可能會更好。此外,您可以使用'exists()'而不是'count()> 1' – dietbacon
缺省值爲BooleanField我使用count,因爲每個材質只允許一個默認值,所以此驗證會檢查它。 –
@dietbacon'exists()'在這裏是無效的,因爲作者需要知道是否有*多於* 1,而不是如果它有一個或多個 – trinchet