Django 'POST' 请求中的验证错误
Validation error in Django 'POST' request
我是 Django Rest Framework 的初学者
我已经为它创建了一个模型和序列化器。就是这样:
models.py
class Car(models.Model):
make = models.CharField(max_length=15)
model = models.CharField(max_length=15)
def __str__(self):
return self.make
class CarRate(models.Model):
rate = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)
serializers.py
class CarRateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = CarRate
fields = ('rate')
class CarSerializer(serializers.HyperlinkedModelSerializer):
rates = CarRateSerializer(many=True)
'''rates = serializers.PrimaryKeyRelatedField(
many=True,
read_only=False,
queryset=CarRate.objects.all()
)'''
def create(self, validated_data):
rates_data = validated_data.pop("rates")
car = Car.objects.create(**validated_data)
for rate_data in rates_data:
CarRate.objects.create(car=car, **rate_data)
return car
class Meta:
model = Car
fields = ('id', 'make', 'model', 'rates')
我想做的是使用 POST 方法和 JSON 为具有特定 ID 的汽车添加费率,但是当我多次这样做时,它会存储所有费率那一个对象。我将添加这样的费率:
{
"id":2,
"rate":4
}
所以这是我的 POST 方法,但它给出了一个响应 Car id not found
,所以它没有通过验证。
views.py
@api_view(['POST'])
def car_rate(request):
if request.method == 'POST':
rate_data = JSONParser().parse(request)
rate_serializer = CarSerializer(data=rate_data)
if rate_serializer.is_valid():
''' Code that checks if a rate is from 1 to 5 '''
return JsonResponse({'message': 'Car id not found!'})
所以我认为可能是个问题,CarSerializer
需要的字段不只是一个 rate
字段,我应该以某种方式将费率传递给那辆车,但不知道如何.
您的汽车费率模型实际上没有要存储的字段 'rate',当前费率字段存储汽车数据而不是费率。因此,将您的 CarRate 模型更改为
class CarRate(models.Model):
car = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)
rate = models.PositiveIntegerField(default=0)
序列化器
class CarRateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = CarRate
fields = ('__all__')
car_rate 查看
@api_view(['POST'])
def car_rate(request):
if request.method == 'POST':
rate_data = JSONParser().parse(request)
rate_serializer = CarRateSerializer(data=rate_data) #Changed Serializer class
if rate_serializer.is_valid():
''' Code that checks if a rate is from 1 to 5 '''
return JsonResponse({'message': 'valid'})
return JsonResponse({'message': 'Car id not found!'})
我是 Django Rest Framework 的初学者
我已经为它创建了一个模型和序列化器。就是这样:
models.py
class Car(models.Model):
make = models.CharField(max_length=15)
model = models.CharField(max_length=15)
def __str__(self):
return self.make
class CarRate(models.Model):
rate = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)
serializers.py
class CarRateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = CarRate
fields = ('rate')
class CarSerializer(serializers.HyperlinkedModelSerializer):
rates = CarRateSerializer(many=True)
'''rates = serializers.PrimaryKeyRelatedField(
many=True,
read_only=False,
queryset=CarRate.objects.all()
)'''
def create(self, validated_data):
rates_data = validated_data.pop("rates")
car = Car.objects.create(**validated_data)
for rate_data in rates_data:
CarRate.objects.create(car=car, **rate_data)
return car
class Meta:
model = Car
fields = ('id', 'make', 'model', 'rates')
我想做的是使用 POST 方法和 JSON 为具有特定 ID 的汽车添加费率,但是当我多次这样做时,它会存储所有费率那一个对象。我将添加这样的费率:
{
"id":2,
"rate":4
}
所以这是我的 POST 方法,但它给出了一个响应 Car id not found
,所以它没有通过验证。
views.py
@api_view(['POST'])
def car_rate(request):
if request.method == 'POST':
rate_data = JSONParser().parse(request)
rate_serializer = CarSerializer(data=rate_data)
if rate_serializer.is_valid():
''' Code that checks if a rate is from 1 to 5 '''
return JsonResponse({'message': 'Car id not found!'})
所以我认为可能是个问题,CarSerializer
需要的字段不只是一个 rate
字段,我应该以某种方式将费率传递给那辆车,但不知道如何.
您的汽车费率模型实际上没有要存储的字段 'rate',当前费率字段存储汽车数据而不是费率。因此,将您的 CarRate 模型更改为
class CarRate(models.Model):
car = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)
rate = models.PositiveIntegerField(default=0)
序列化器
class CarRateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = CarRate
fields = ('__all__')
car_rate 查看
@api_view(['POST'])
def car_rate(request):
if request.method == 'POST':
rate_data = JSONParser().parse(request)
rate_serializer = CarRateSerializer(data=rate_data) #Changed Serializer class
if rate_serializer.is_valid():
''' Code that checks if a rate is from 1 to 5 '''
return JsonResponse({'message': 'valid'})
return JsonResponse({'message': 'Car id not found!'})