Python Django Rest框架序列化错误:类型为的对象不可JSON序列化
我对django和python都是新手,目前正在尝试使用django REST框架实现REST api。我知道有很多类似的问题,但它们是使用.json序列化对象,而我不是 我有两个模型船长和船,如下所示:Python Django Rest框架序列化错误:类型为的对象不可JSON序列化,python,json,django,Python,Json,Django,我对django和python都是新手,目前正在尝试使用django REST框架实现REST api。我知道有很多类似的问题,但它们是使用.json序列化对象,而我不是 我有两个模型船长和船,如下所示: //models.py from django.db import models class Captain(models.Model): name = models.CharField(max_length=255, blank=False, uni
//models.py
from django.db import models
class Captain(models.Model):
name = models.CharField(max_length=255, blank=False, unique=False)
last_name = models.CharField(max_length=255, blank=False, unique=False)
government_id = models.CharField(max_length=55, blank=False, unique=True)
company_name = models.CharField(max_length=255, blank=False, unique=False)
phone_number = models.CharField(max_length=55, blank=False, unique=False)
tax_id = models.CharField(max_length=55, blank=False, unique=True)
date_created = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
class Boat(models.Model):
captain = models.ForeignKey(Captain, on_delete=models.CASCADE, null=True, blank=True, related_name='boats')
name = models.CharField(max_length=55, blank=False)
journey_type = models.CharField(max_length=55, null=True, blank=True)
category = models.CharField(max_length=55, null=True, blank=True)
passenger_capacity = models.IntegerField()
crew_count = models.IntegerField()
have_ac = models.IntegerField(default=0)
year_built = models.DateField
year_restored = models.DateField(blank=True)
engine = models.CharField(max_length=255, blank=True, null=True)
generator = models.CharField(max_length=255, blank=True, null=True)
width = models.CharField(max_length=255, null=True)
height = models.CharField(max_length=255, null=True)
length = models.CharField(max_length=255, null=True)
wc_count = models.IntegerField(null=True)
master_cabin_count = models.IntegerField(null=True)
standart_cabin_count = models.IntegerField(blank=False, null=False)
date_created = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
正如你所看到的,每艘船都有一名船长,而一名船长可以有多艘船。所以在数据库中,有一个船长id字段用于船表。我为每个模型定义了两个序列化程序:
//serializers.py
from rest_framework import serializers
from .models import Captain, Boat
class CaptainSerializer(serializers.ModelSerializer):
class Meta:
model = Captain
fields = ('id', 'name', 'last_name', 'government_id', 'company_name', 'phone_number', 'tax_id', 'date_created', 'date_modified','boats')
class BoatSerializer(serializers.ModelSerializer):
captain = serializers.PrimaryKeyRelatedField(many=False, read_only=True)
class Meta:
model = Boat
fields = ('id', 'captain', 'name', 'journey_type', 'category', 'passenger_capacity', 'crew_count', 'have_ac', 'year_built', 'year_restored', 'wc_count', 'standart_cabin_count')
然后我为每个模型定义了视图。
//views.py
从django.shortcuts导入渲染
从rest_框架导入泛型
from.serializers导入船长序列化器、船序列化器
从。模型进口船长,船
class CaptainCreateView(generics.ListCreateAPIView):
queryset = Captain.objects.all()
serializer_class = CaptainSerializer
def perform_create(self, serializer):
serializer.save()
class CaptainDetailsView(generics.RetrieveUpdateDestroyAPIView):
lookup_field = 'pk'
serializer_class = CaptainSerializer
queryset = Captain.objects.all()
class BoatCreateView(generics.ListCreateAPIView):
queryset = Boat.objects.all()
serializer_class = BoatSerializer
def perform_create(self, serializer):
serializer.save()
当我转到页面localhost:port/captains/(或/GET/captains from postman)时,我可以得到船长模型,包括他拥有的船只
但问题是:当我转到localhost:port/boats(或postman)时
类型为的对象不可JSON序列化
异常类型:在/处的类型错误/
异常值:类型为的对象不可JSON序列化
有什么办法可以解决这个问题吗?提前感谢。我认为
船
模型中的年
字段定义得不好(您正在分配类日期字段
,但没有创建它的实例):
我认为
Boat
模型中的year\u builded
字段没有很好地定义(您正在分配类DateField
,但没有创建它的实例):
您需要显示URL和完整回溯。您需要显示URL和完整回溯。
class Boat(models.Model):
year_built = models.DateField # should be models.DateField()