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() 方法中的数据。提前谢谢。
django 对象的验证(文档):
\n\n\n验证模型涉及三个步骤:
\n\n
\n- 验证模型字段 -
\nModel.clean_fields()- 验证整个模型 -
\nModel.clean()- 验证字段的唯一性 -
\nModel.validate_unique()当您调用 model\xe2\x80\x99s
\nfull_clean()\n方法时,将执行所有三个步骤。
所以你的方法clean()是正确的,你只需要在保存模型实例之前调用它(它不会自动调用)。
这可以通过调用 来完成r.clean(),或者您可以通过调用 来进行完整验证(上述 3 个步骤)r.full_clean()。
因此,在您的代码中添加验证调用之前r.save():
...\nr = Restaurant()\n...\nr.full_clean()\nr.save()\n...\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
12268 次 |
| 最近记录: |