3 回答
TA贡献1772条经验 获得超8个赞
您可以使用 DRF Serializer 的验证。例如,创建一个序列化程序,并添加一个验证方法命名validate_<field_name>。然后在那里添加验证代码:
import re
class MessagesSerializer(serializers.ModelSerializer):
class Meta:
model = Messages
fields = "__all__"
def validate_phone_number(self, value):
rule = re.compile(r'(^[+0-9]{1,3})*([0-9]{10,11}$)')
if not rule.search(value):
raise serializers.ValidationError("Invalid Phone Number")
return value
并在视图中使用它:
class SomeView(APIView):
def post(self, request, *args, **kwargs):
serializer = MessagesSerializer(
data=request.data
)
if serializer.is_valid(): # will call the validate function
serializer.save()
return Response({'success': True})
else:
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST
)
TA贡献1830条经验 获得超3个赞
查看官方文档了解如何完成此操作:https : //docs.djangoproject.com/en/2.2/ref/models/instances/#django.db.models.Model.clean
此方法应用于提供自定义模型验证,并根据需要修改模型上的属性。例如,您可以使用它自动为字段提供值,或者进行需要访问多个字段的验证:
def clean(self):
# Don't allow draft entries to have a pub_date.
if self.status == 'draft' and self.pub_date is not None:
raise ValidationError(_('Draft entries may not have a publication date.'))
# Set the pub_date for published items if it hasn't been set already.
if self.status == 'published' and self.pub_date is None:
self.pub_date = datetime.date.today()
实现一个clean方法,ValidationError如果它检测到数据有问题,就会引发一个。然后,您可以通过调用在视图中捕获此内容model_obj.full_clean():
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
try:
article.full_clean()
except ValidationError as e:
non_field_errors = e.message_dict[NON_FIELD_ERRORS]
TA贡献1836条经验 获得超3个赞
您想在保存之前验证字段。
有很多技术可以做到这一点。
使用序列化程序。如果您使用的是 django rest 框架,那么您可以轻松地使用序列化程序进行验证。 https://www.django-rest-framework.org/api-guide/validators/
Django 模型验证。这是通过覆盖模型类中的一些可用方法来实现的。 https://docs.djangoproject.com/en/2.2/ref/models/instances/#validating-objects
对于您的情况,我建议第二种选择。覆盖文档中的方法 clean_fields。然后在保存之前调用该方法。
添加回答
举报