簡體   English   中英

Django:如何在發布請求后將數據保存到數據庫之前如何檢查數據是否正確?

[英]Django: How to check if data is correct before saving it to a database on a post request?

我希望能夠通過將其發送到我的函數來解析django rest api項目中來自發布請求的數據,如果該數字在保存到數據庫之前是有效的,則返回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,但沒有成功,也許我不知道如何在搜索時說明問題。

您可以使用DRF序列化器的驗證 例如,創建一個序列化器,並添加一個命名為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
          )

盡管在DRF序列化器中驗證輸入數據 (例如張貼的電話號碼)更常見,但Model.save()是一個選項。

您可以根據關注點分離的原則來決定在哪里進行檢查。

檢查官方文檔以了解如何完成此操作: 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]

您要在保存之前驗證字段。

有很多技術可以做到這一點。

對於您的情況,我建議第二個選擇。 覆蓋文檔中的方法clean_fields。 然后在保存之前調用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM