Как использовать метод django model clean ()? - PullRequest
0 голосов
/ 09 июля 2020
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.')})
        

Метод 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)

Как я могу обработать проверку метода clean ()? Я также проверяю данные в файле serializer.py, но все же хочу проверить данные в методе модели clean (). Заранее спасибо.

1 Ответ

0 голосов
/ 09 июля 2020

Проверка django объектов ( docs ):

Проверка модели состоит из трех этапов:

  • Проверка модели полей - Model.clean_fields()
  • Проверить модель в целом - Model.clean()
  • Проверить уникальность поля - Model.validate_unique()

Все три шага выполняются, когда вы вызываете метод модели full_clean().

Итак, ваш метод clean() правильный, вам просто нужно вызвать его перед сохранением экземпляра модели (он не вызывается автоматически).

Это можно сделать, просто позвонив r.clean(), или вы можете выполнить полную проверку (3 шага, упомянутых выше), позвонив r.full_clean().

Итак, в вашем коде добавьте вызов проверки перед r.save():

...
r = Restaurant()
...
r.full_clean()
r.save()
...
...