为了账号安全,请及时绑定邮箱和手机立即绑定

Django:如何在发布请求时将数据保存到数据库之前检查数据是否正确?

Django:如何在发布请求时将数据保存到数据库之前检查数据是否正确?

交互式爱情 2021-12-26 10:36:15
我希望能够通过将数据发送到我的函数来解析来自我的 django rest api 项目中的 post 请求的数据,如果该数字在将其保存到数据库之前有效,则返回 true 或 false,如果错误发送自定义发送给执行请求的客户端的错误请求消息。有人告诉我我可以覆盖 create 方法来做到这一点,但我不知道如何去做。到目前为止,我的代码如下所示:class Messages(models.Model):    phone_number = models.CharField(max_length=256, default='')    message_body = models.CharField(max_length=256, default='')    created = models.DateTimeField(auto_now_add=True)    def __str__(self):        return self.phone_number + ' ' + self.message_body + ' ' + self.created    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):        # I assume this is where I would do the check before saving it but not sure how? example would be like:        # if numberValid(self.phone_number):        #    then save to the database        # else:        #    then send back a bad request?        super(Messages, self).save(force_update=force_update)        send_sms(self.phone_number, self.message_body)    def delete(self, using=None, keep_parents=False):        super(Messages, self).delete(using=using, keep_parents=keep_parents)所以基本上只是想知道如何解决这个问题的一些方向。甚至有用的链接将不胜感激。我确实查看了 stackoverflow 但没有成功,也许我不知道如何在搜索时正确表达问题。
查看完整描述

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

          )


查看完整回答
反对 回复 2021-12-26
?
牛魔王的故事

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]


查看完整回答
反对 回复 2021-12-26
?
米脂

TA贡献1836条经验 获得超3个赞

您想在保存之前验证字段。

有很多技术可以做到这一点。

对于您的情况,我建议第二种选择。覆盖文档中的方法 clean_fields。然后在保存之前调用该方法。


查看完整回答
反对 回复 2021-12-26
  • 3 回答
  • 0 关注
  • 285 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信