【问题标题】:Django Rest Framework getting Bad Request:400 error with serializer errors that I thought I took care of but I can't figure out where I went wrong?Django Rest Framework 收到 Bad Request:400 error with serializer errors 我以为我已经解决了但我无法弄清楚我哪里出错了?
【发布时间】:2023-01-24 07:59:06
【问题描述】:

我正在尝试通过 insomnia 发出一个 post 请求来创建一个 snake 实例,但是我收到了 Bad Request:400 错误。我打印了序列化程序错误并得到了这个:

{
    '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')]
}

这是我的序列化程序,我认为它会处理空/空白字段:

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'
            ]

这是我的模型:

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)

失眠请求的照片我也补上了insomnia_request

我认为在字段上添加 allow_null 和 allow_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)

我希望能够更正错误,说它们是必填字段,但事实并非如此。

我还以为我已经纠正了外键问题,但它说它们应该是一个 url 字符串?我使用的是 id,它得到的是正确的,所以我不确定它为什么生气

【问题讨论】:

    标签: serialization django-rest-framework django-views 400-bad-request


    【解决方案1】:

    我想出了如何修复我的必填字段错误。我必须将 required=True 添加到序列化程序字段,但我仍然无法让外键工作

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多