当字典初始化序列化程序时,serializer.data和serializer.validate_data为空



已解决(底部原因(

我正在使用django和drf构建一个应用程序。在测试序列化程序时,我发现由于null约束,序列化程序无法将数据保存到数据库。下面是测试代码、序列化程序和模型。

location_serializer_data: LocationDict = {
'address': 'address',
'latitude': 11.1,
'longitude': 22.2,
}

@pytest.mark.django_db
def test_deserializing(self):
serializer = LocationSerializer(data=location_serializer_data)
serializer.is_valid()
new_location = serializer.save() # < where the test explodes

这是错误信息

django.db.utils.IntegrityError: NOT NULL constraint failed: locations_location.latitude

我发现serializer.initial_data得到了适当的数据,但在serializer.is_valid()之后,serializer.dataserializer.validated_data中的两个变成了空白字典

我搜索了一下,但没有发现是什么原因造成的。

  • 这是我的序列化程序类
from rest_framework import serializers
from locations.models import Location
from rest_framework.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator

class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
fields = ('address', 'latitude', 'longitude')
extra_kwargs = {
'address': {'required': True},
'latitude': {
'required': True,
'validators': [MaxValueValidator(90), MinValueValidator(-90)]
},
'longitude': {
'required': True,
'validators': [MaxValueValidator(180), MinValueValidator(-180)]
},
}

此外,并非所有都进行验证

++我通过编辑Location模型解决了这个问题。

from django.db import models

class Location(models.Model):
address = models.CharField(verbose_name='address',max_length=255)
latitude = models.FloatField(verbose_name='latitude',editable=False)
longitude = models.FloatField(verbose_name='longitude',editable=False)

删除editable=False后,序列化程序运行良好。这是一个错误还是有意的?

.is_valid((方法会进行验证,但不会自行引发错误。我们可以执行serializer.is_valid(raise_exception=True(。如果数据无效,则会引发验证错误。

我认为以下代码应该能帮助您

@pytest.mark.django_db
def test_deserializing(self):
serializer = LocationSerializer(data=location_serializer_data)
serializer.is_valid(raise_exception=True) # < Now code will raise error here
new_location = serializer.save() 

这将确保在验证级别上引发异常

一个可能的原因是字段latitudeLocationSerializer中不存在;"清除";通过序列化程序验证。如果可能的话,请在LocationSerializer上分享详细信息,以便我们能够提供进一步的帮助。

相关内容

  • 没有找到相关文章

最新更新