Django Rest Framework创建Snake实例时400错误排查求助
问题:POST请求创建Snake实例返回400 Bad Request错误
通过Insomnia发送POST请求创建Snake实例时,收到400 Bad Request错误,序列化器错误信息如下:
{ 'owner': [ErrorDetail(string='Incorrect type. Expected URL string, received ReturnDict.', code='incorrect_type')], 'birthday': [ErrorDetail(string='This field is required.', code='required')], 'date_aquired': [ErrorDetail(string='This field is required.', code='required')], 'species': [ErrorDetail(string='Incorrect type. Expected URL string, received ReturnDict.', code='incorrect_type')], 'breeder_id': [ErrorDetail(string='This field is required.', code='required')], 'mother': [ErrorDetail(string='This field is required.', code='required')], 'father': [ErrorDetail(string='This field is required.', code='required')] }
序列化器代码
原本认为以下序列化器可以处理null/blank字段:
class SnakeDetailSerializer(serializers.HyperlinkedModelSerializer): href = serializers.HyperlinkedIdentityField(view_name="api_species_detail") birthday = serializers.DateField(allow_null=True) date_aquired = serializers.DateField(allow_null=True) enclosure_id = serializers.CharField(allow_null=True, allow_blank=True) breeder_id = serializers.CharField(allow_null=True, allow_blank=True) father = serializers.CharField(allow_null=True, allow_blank=True) mother = serializers.CharField(allow_null=True, allow_blank=True) class Meta: model = Snake fields = [ 'href', 'id', 'owner', 'name', 'age', 'birthday', 'date_aquired', 'gender', 'status', 'weight', 'enclosure_id', 'species', 'is_cbb', 'is_imported', 'breeder_id', 'mother', 'father' ]
模型定义
对应的Snake模型:
class Snake(models.Model): # BASIC INFO owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="collection", on_delete=models.CASCADE ) STATUS_CHOICES = ( ('Active', 'Active'), ('Deceased', 'Deceased'), ('Quarantine', 'Quarantine'), ('For Sale', 'For Sale'), ('On Loan', 'On Loan'), ('Reserved', 'Reserved'), ('Sold', 'Sold') ) GENDER_CHOICES = ( ('M', 'Male'), ('F', 'Female'), ('NA', 'Unknown') ) name = models.CharField(max_length=255) age = models.SmallIntegerField() birthday = models.DateField(null=True, blank=True) date_aquired = models.DateField(null=True, blank=True) status = models.CharField(max_length=10, choices=STATUS_CHOICES) gender = models.CharField(max_length=2, choices=GENDER_CHOICES) weight = models.DecimalField(max_digits=10, decimal_places=2) enclosure_id = models.CharField(max_length=255, null=True, blank=True) # SPECIES INFO species = models.ForeignKey(SpeciesInfo, related_name="snakes", on_delete=models.PROTECT) # LINEAGE INFO is_cbb = models.BooleanField(default=False) is_imported = models.BooleanField(default=False) breeder_id = models.CharField(max_length=255, null=True, blank=True) mother = models.CharField(max_length=255, null=True, blank=True) father = models.CharField(max_length=255, null=True, blank=True)
视图代码
处理请求的视图函数:
@api_view(['GET', 'POST']) def api_list_snakes(request): if request.method == 'GET': snakes = Snake.objects.all() serializer = SnakeListSerializer(snakes, many=True) return Response( {'snakes': serializer.data} ) else: data = JSONParser().parse(request) # print(data) species = SpeciesInfo.objects.get(id=data["species"]) species_serialized = SpeciesInfoSerializer(species, context={'request':request}) owner = GetUserSerializer(request.user) data['owner'] = owner.data data["species"] = species_serialized.data serializer = SnakeDetailSerializer(data=data, context={'request':request}) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) print(serializer.errors) return Response(serializer.data, status=400)
问题说明
已在序列化器中为允许null/blank的字段设置allow_null=True和allow_blank=True,但仍收到必填字段错误;同时外键字段报错期望URL字符串,实际请求中使用了ID且能获取到对应数据,需要解决这两个问题。
内容的提问来源于stack exchange,提问作者Lvermaelen
相关产品推荐
相关产品推荐

