我正在制作一个获取ip地址的小型rest api,然后将其发送到ipstack并保存返回的数据do数据库。问题是我的数据在调用 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']
浏览量
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
答案 0 :(得分:0)
使用以下代码检查错误并修复它们。
print(serializer.errors)
答案 1 :(得分:0)
您需要在纬度和经度而不是十进制字段上设置models.FloatField()