簡體   English   中英

Django 序列化程序不會保存到數據庫

[英]Django serializer won't save to database

我正在制作小的 rest 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']

觀點

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM