Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架序列化错误:类型为的对象不可JSON序列化_Python_Json_Django - Fatal编程技术网

Python Django Rest框架序列化错误:类型为的对象不可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

我对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, 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()