You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:39