如何验证用作外键的对象
How to validate object used as foreign key
Django==2.2.5
你能帮我验证一下用作外键的对象是否没有归档吗?
问题:parent_is_archived(obj) 接收 int 作为其参数。例如, 1. 它不是我可以检查其字段的对象。也没有这个int代表的pk型号的迹象。
也许我应该重新定义一些方法,比如 clean_fields?
class Level_1(models.Model):
archived = models.BooleanField(default=False,
verbose_name="Archived")
def parent_is_archived(obj):
if ...:
message = 'Parent object is archived'
raise ValidationError(message)
class Level_2(models.Model):
parent_level = models.ForeignKey(Level_1,
on_delete=models.CASCADE,
validators=[parent_is_archived])
您可以改写保存方法:
class Level_2(models.Model):
parent_level = models.ForeignKey(Level_1,
on_delete=models.CASCADE,
validators=[parent_is_archived])
def save(self, *args, **kwargs):
if self.parent_level.archived:
raise Exception('....')
super().save(*args, **kwargs)
或者, 你也可以使用 Model.clean()
方法,你可以在其中放置限制:
class Level_2(models.Model):
...
def clean(self):
if self.parent_level.archived:
raise ValidationError('...')
并使用instance.full_clean()
调用clean方法。例如:
def some_view(request):
form = LevelTwoForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.full_clean()
instance.save()
# rest of the code
Django==2.2.5
你能帮我验证一下用作外键的对象是否没有归档吗?
问题:parent_is_archived(obj) 接收 int 作为其参数。例如, 1. 它不是我可以检查其字段的对象。也没有这个int代表的pk型号的迹象。
也许我应该重新定义一些方法,比如 clean_fields?
class Level_1(models.Model):
archived = models.BooleanField(default=False,
verbose_name="Archived")
def parent_is_archived(obj):
if ...:
message = 'Parent object is archived'
raise ValidationError(message)
class Level_2(models.Model):
parent_level = models.ForeignKey(Level_1,
on_delete=models.CASCADE,
validators=[parent_is_archived])
您可以改写保存方法:
class Level_2(models.Model):
parent_level = models.ForeignKey(Level_1,
on_delete=models.CASCADE,
validators=[parent_is_archived])
def save(self, *args, **kwargs):
if self.parent_level.archived:
raise Exception('....')
super().save(*args, **kwargs)
或者, 你也可以使用 Model.clean()
方法,你可以在其中放置限制:
class Level_2(models.Model):
...
def clean(self):
if self.parent_level.archived:
raise ValidationError('...')
并使用instance.full_clean()
调用clean方法。例如:
def some_view(request):
form = LevelTwoForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.full_clean()
instance.save()
# rest of the code