![](/img/trans.png)
[英]Within Django, how do I add a new value to request.POST data before saving?
[英]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]
您要在保存之前驗證字段。
有很多技術可以做到這一點。
使用序列化器。 如果您使用的是django rest框架,則可以輕松使用serilizers進行驗證。 https://www.django-rest-framework.org/api-guide/validators/
django模型驗證。 這是通過重寫models類中的一些可用方法來實現的。 https://docs.djangoproject.com/en/2.2/ref/models/instances/#validating-objects
對於您的情況,我建議第二個選擇。 覆蓋文檔中的方法clean_fields。 然后在保存之前調用該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.