已解决(底部原因(
我正在使用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.data
、serializer.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()
这将确保在验证级别上引发异常
一个可能的原因是字段latitude
在LocationSerializer
中不存在;"清除";通过序列化程序验证。如果可能的话,请在LocationSerializer
上分享详细信息,以便我们能够提供进一步的帮助。