Django 序列化程序不会保存到数据库

时间:2021-02-17 09:34:17

标签: python django django-rest-framework django-serializer

我正在制作一个获取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

2 个答案:

答案 0 :(得分:0)

使用以下代码检查错误并修复它们。

print(serializer.errors)

答案 1 :(得分:0)

您需要在纬度和经度而不是十进制字段上设置models.FloatField()

相关问题