如何使用 django 模型 clean() 方法?

Jas*_*rse 3 django django-models django-views django-rest-framework

class Restaurant(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=120, unique=True, verbose_name="Name")
    direction = models.CharField(max_length=120, verbose_name="Direction")
    phone = models.IntegerField()
    slug = models.SlugField(blank=True)

    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return f'/res/{self.slug}'

    @property
    def full_name(self):
        return self.name   
    
    
    def clean(self):
        from django.core.exceptions import ValidationError        
       
        if len(str(self.phone))<=5:
            raise ValidationError({'phone':('Enter Correct number.')})
        
Run Code Online (Sandbox Code Playgroud)

clean() 方法不起作用。我的view.py代码如下:

class RestaurantView(generics.ListCreateAPIView):
    queryset=Restaurant.objects.all()
    serializer_class=RestaurantSerializer

    def get(self,request):
        query=self.get_queryset()        
        serializer=RestaurantSerializer(query,many=True)        
        return Response(serializer.data)

    def post(self,request):
        serializer  =   RestaurantSerializer(data=request.POST)
        if serializer.is_valid(raise_exception=True):
            name=serializer.validated_data.get('name')
            direction=serializer.validated_data.get('direction')
            phone=serializer.validated_data.get('phone')
            r=Restaurant()
            r.name=name,
            r.direction=direction,
            r.phone=phone
            r.save()
            response={'msg':'Data Saved Successfully'}
            return Response(response)
Run Code Online (Sandbox Code Playgroud)

如何处理 clean() 方法验证?我还在验证serializer.py 文件中的数据,但我仍然想验证模型 clean() 方法中的数据。提前谢谢。

Ral*_*alf 8

django 对象的验证(文档):

\n
\n

验证模型涉及三个步骤:

\n
    \n
  • 验证模型字段 -Model.clean_fields()
  • \n
  • 验证整个模型 -Model.clean()
  • \n
  • 验证字段的唯一性 -Model.validate_unique()
  • \n
\n

当您调用 model\xe2\x80\x99s full_clean()\n方法时,将执行所有三个步骤。

\n
\n

所以你的方法clean()是正确的,你只需要在保存模型实例之前调用它(它不会自动调用)。

\n

这可以通过调用 来完成r.clean(),或者您可以通过调用 来进行完整验证(上述 3 个步骤)r.full_clean()

\n

因此,在您的代码中添加验证调用之前r.save()

\n
...\nr = Restaurant()\n...\nr.full_clean()\nr.save()\n...\n
Run Code Online (Sandbox Code Playgroud)\n