Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何验证用作外键的对象_Django_Django Models_Django Validation - Fatal编程技术网

Django 如何验证用作外键的对象

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,

Django==2.2.5

您能帮我验证用作外键的对象是否未存档吗

问题是:parent_is_archive(obj)接收int作为其参数。例如,1。它不是一个我可以检查其字段的对象。没有迹象表明这个int代表的是哪个模型的pk

也许我应该重新定义一些方法,比如clean_字段

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的情况下,您的评论将不起作用。