Django 如何验证用作外键的对象
Django==2.2.5 您能帮我验证用作外键的对象是否未存档吗 问题是:parent_is_archive(obj)接收int作为其参数。例如,1。它不是一个我可以检查其字段的对象。没有迹象表明这个int代表的是哪个模型的pk 也许我应该重新定义一些方法,比如clean_字段Django 如何验证用作外键的对象,django,django-models,django-validation,Django,Django Models,Django Validation,Django==2.2.5 您能帮我验证用作外键的对象是否未存档吗 问题是:parent_is_archive(obj)接收int作为其参数。例如,1。它不是一个我可以检查其字段的对象。没有迹象表明这个int代表的是哪个模型的pk 也许我应该重新定义一些方法,比如clean_字段 class Level_1(models.Model): archived = models.BooleanField(default=False,
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])
您可以替代save方法:
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)
或者,也可以使用方法,其中可以设置限制:
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
您可以替代save方法:
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)
或者,也可以使用方法,其中可以设置限制:
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
为什么不重新定义clean_字段?你的意思是覆盖clean_fields()方法吗?是的,那个方法。你不需要。根据,它返回FK的id。另外,我想我误解了你的问题,你得到的int是
级别1的PK。因此,您可以通过instance=Level_1.objects.get(pk=obj)
获取对象。在我的例子中,验证器是可重用的。我有几个层次。例如,对于级别为5的情况,您的注释abowe将没有帮助。为什么不重新定义clean_字段?您的意思是覆盖clean_fields()方法吗?是的,该方法。您不需要这样做。根据,它返回FK的id。另外,我想我误解了你的问题,你得到的int是级别1的PK。因此,您可以通过instance=Level_1.objects.get(pk=obj)
获取对象。在我的例子中,验证器是可重用的。我有几个层次。例如,在等级为5的情况下,您的评论将不起作用。