Django 序列化程序不会保存到数据库
Django serializer won't save to database
我正在做小休息 api 获取 ip 地址然后将其发送到 ipstack 并将返回的数据保存到数据库中。问题是调用 serializer.save 时我的数据没有保存。我确定这是个小问题,但我花了太多时间查看这段代码,所以我什么也没看到
这里ip的数据不对不要介意我已经改了
让我们从 models.py
开始
class Location(models.Model):
ip = models.CharField(max_length=15)
type = models.CharField(max_length=6)
latitude = models.DecimalField(max_digits=10, decimal_places=8)
longitude = models.DecimalField(max_digits=10,decimal_places=0)
continent_code = models.CharField(max_length=2)
continent_name = models.CharField(max_length=20)
country_code = models.CharField(max_length=10)
country_name = models.CharField(max_length=70)
region_code = models.CharField(max_length=10)
region_name = models.CharField(max_length=50)
city = models.CharField(max_length=100)
zip = models.CharField(max_length=10)
def __str__(self):
return str(self.ip)
序列化器
from rest_framework import serializers
from .models import *
class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
exclude = ['id']
vievws
ip = '89.64.124.126'
if ip:
try:
data = location_search.get_location(ip)
if data is None:
return Response(status=status.HTTP_400_BAD_REQUEST,)
except:
return Response("Our services are temporarily unavailable", status=503,)
serializer = self.serializer_class(data=data)
print(serializer)
print(serializer.is_valid())
if serializer.is_valid():
serializer.save()
return Response("Data was successfully added", status=status.HTTP_201_CREATED,)
else:
return Response("Database error occurred, try again later",status=status.HTTP_500_INTERNAL_SERVER_ERROR,)
这是我在打印时得到的结果
LocationSerializer(data={'ip': '89.64.124.126', 'type': 'ipv4', 'continent_code': 'EU', 'continent_name': 'Europe', 'country_code': 'PL', 'country_name': 'Poland', 'region_code': 'MZ', 'region_name': 'Mazovia', 'city': 'Warsaw', 'zip': '00-877', 'latitude': 42.239688873291016, 'longitude': 10.98748016357422, 'location': {'geoname_id': 756135, 'capital': 'Warsaw', 'languages': [{'code': 'pl', 'name': 'Polish', 'native': 'Polski'}], 'country_flag': 'http://assets.ipstack.com/flags/pl.svg', 'country_flag_emoji': '', 'country_flag_emoji_unicode': 'U+1F1F5 U+1F1F1', 'c alling_code': '48', 'is_eu': True}}):
ip = CharField(max_length=15)
type = CharField(max_length=6)
latitude = DecimalField(decimal_places=8, max_digits=10)
longitude = DecimalField(decimal_places=0, max_digits=10)
continent_code = CharField(max_length=2)
continent_name = CharField(max_length=20)
country_code = CharField(max_length=10)
country_name = CharField(max_length=70)
region_code = CharField(max_length=10)
region_name = CharField(max_length=50)
city = CharField(max_length=100)
zip = CharField(max_length=10)
False
使用下面的代码检查错误并修复它们。
print(serializer.errors)
您需要在纬度和经度而不是小数字段上设置 models.FloatField()
我正在做小休息 api 获取 ip 地址然后将其发送到 ipstack 并将返回的数据保存到数据库中。问题是调用 serializer.save 时我的数据没有保存。我确定这是个小问题,但我花了太多时间查看这段代码,所以我什么也没看到
这里ip的数据不对不要介意我已经改了 让我们从 models.py
开始class Location(models.Model):
ip = models.CharField(max_length=15)
type = models.CharField(max_length=6)
latitude = models.DecimalField(max_digits=10, decimal_places=8)
longitude = models.DecimalField(max_digits=10,decimal_places=0)
continent_code = models.CharField(max_length=2)
continent_name = models.CharField(max_length=20)
country_code = models.CharField(max_length=10)
country_name = models.CharField(max_length=70)
region_code = models.CharField(max_length=10)
region_name = models.CharField(max_length=50)
city = models.CharField(max_length=100)
zip = models.CharField(max_length=10)
def __str__(self):
return str(self.ip)
序列化器
from rest_framework import serializers
from .models import *
class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
exclude = ['id']
vievws
ip = '89.64.124.126'
if ip:
try:
data = location_search.get_location(ip)
if data is None:
return Response(status=status.HTTP_400_BAD_REQUEST,)
except:
return Response("Our services are temporarily unavailable", status=503,)
serializer = self.serializer_class(data=data)
print(serializer)
print(serializer.is_valid())
if serializer.is_valid():
serializer.save()
return Response("Data was successfully added", status=status.HTTP_201_CREATED,)
else:
return Response("Database error occurred, try again later",status=status.HTTP_500_INTERNAL_SERVER_ERROR,)
这是我在打印时得到的结果
LocationSerializer(data={'ip': '89.64.124.126', 'type': 'ipv4', 'continent_code': 'EU', 'continent_name': 'Europe', 'country_code': 'PL', 'country_name': 'Poland', 'region_code': 'MZ', 'region_name': 'Mazovia', 'city': 'Warsaw', 'zip': '00-877', 'latitude': 42.239688873291016, 'longitude': 10.98748016357422, 'location': {'geoname_id': 756135, 'capital': 'Warsaw', 'languages': [{'code': 'pl', 'name': 'Polish', 'native': 'Polski'}], 'country_flag': 'http://assets.ipstack.com/flags/pl.svg', 'country_flag_emoji': '', 'country_flag_emoji_unicode': 'U+1F1F5 U+1F1F1', 'c alling_code': '48', 'is_eu': True}}):
ip = CharField(max_length=15)
type = CharField(max_length=6)
latitude = DecimalField(decimal_places=8, max_digits=10)
longitude = DecimalField(decimal_places=0, max_digits=10)
continent_code = CharField(max_length=2)
continent_name = CharField(max_length=20)
country_code = CharField(max_length=10)
country_name = CharField(max_length=70)
region_code = CharField(max_length=10)
region_name = CharField(max_length=50)
city = CharField(max_length=100)
zip = CharField(max_length=10)
False
使用下面的代码检查错误并修复它们。
print(serializer.errors)
您需要在纬度和经度而不是小数字段上设置 models.FloatField()