【发布时间】: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