這是我的模型:當HTTP POST請求的有效載荷爲空不完整的驗證消息
class Profile(models.Model):
user = models.OneToOneField(User)
phone = models.CharField(max_length=20, blank=True, null=True)
designation = models.CharField(max_length=50, blank=True, null=True)
roles = models.ManyToManyField(Role, related_name="profiles")
,這是串行:
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
required=True, validators=[UniqueValidator(queryset=User.objects.all())])
full_name = serializers.CharField(max_length=60, write_only=True)
phone = serializers.CharField(
max_length=20, allow_blank=True, required=False, write_only=True)
designation = serializers.CharField(
max_length=50, allow_blank=True, required=False, write_only=True)
roles = serializers.MultipleChoiceField(
choices=models.Role.objects.values_list('id', flat=True), write_only=True)
class Meta:
model = User
fields = ('id', 'email', 'full_name', 'phone', 'designation', 'roles')
問題
所有請求都與發送Content-Type: application/json
當我POST具有空淨荷的請求,DRF提出了一個400(不完全必需的字段)
{ "full_name": [ "required" ], "email": [ "required" ], }
當POST請求體是
{}
,DRF提高400,與所有強制字段{ "full_name": [ "required" ], "email": [ "required" ], "roles": [ "required" ] }
問題
如何確保申請機構是空白的,DRF會提出ParseError
?
已經嘗試過
- 添加
allow_blank
和required
到角色中UserSerializer沒有任何效果。 - 使用
APITestCase
進行測試時沒有不一致性。我可以通過ARC重現錯誤。
解決方法
增加了一個自定義異常處理程序,檢查此:
request = context['request']
if request.content_type == 'application/json' and type(request.data) != dict:
return response.Response(
{'detail': 'Invalid body'}, status=status.HTTP_400_BAD_REQUEST)
當請求主體爲空,request.data是django.http.QueryDict
。這是我正在檢查的。但是,我寧願在其起源處提出這個錯誤,而不是檢查它產生的副作用。
我忘了回覆,我的壞。我需要確保如果請求有效負載爲空,則'1')Django產生一個ValidationError(這可能不是正確的操作)或'2)Django返回正確的(和完整的)驗證錯誤。 您已經指出空的請求不是*非法*。所以,你覺得我怎麼可以修復'2)'? – Ajoy
開始調試該MultipleChoice字段正在進行的操作。將它設置爲'required = True'?等我不知道爲什麼它可能不會總是返回完整的驗證錯誤。如果你可以用一個簡單的'Serializer'(不是ModelSerializer)和一個視圖來複制問題,那最好。那麼如果你無法弄清楚,也許別人可以。是的,留在試圖獲得完整和正確的錯誤。 –
你有沒有設法重現「不完整的必填字段」問題?我記得看過幾次,或者想過我做過,但現在我明確地尋找它,我也無法重現它。 –