【发布时间】:2019-04-29 04:42:24
【问题描述】:
我是 django 和 python 的新手,目前正在尝试使用 django-rest-framework 实现 REST api。我知道有很多类似的问题,但他们使用 .json 序列化对象,而我不是。
我有 2 个模型船长和船如下:
//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_framework 导入泛型 从 .serializers 导入 CaptainSerializer、BoatSerializer 从 .models 导入船长,船
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)时,我可以拥有船长模型,包括他拥有的船。
但问题是:当我去 localhost:port/boats(或邮递员)时,它会给出,
类型类型的对象不是 JSON 可序列化的
异常类型:/boats/ 处的 TypeError 异常值:类型类型的对象不是 JSON 可序列化的
有什么想法可以解决这个问题吗?提前致谢。
【问题讨论】:
-
您需要显示您的网址和完整的回溯。