【问题标题】:Django Rest Framework serialization error: Object of type type is not JSON serializableDjango Rest Framework 序列化错误:类型类型的对象不是 JSON 可序列化的
【发布时间】: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 可序列化的

有什么想法可以解决这个问题吗?提前致谢。

【问题讨论】:

  • 您需要显示您的网址和完整的回溯。

标签: python json django


【解决方案1】:

我认为Boat 模型中的year_built 字段定义不明确(您分配了DateField 类但没有创建它的实例):

class Boat(models.Model):
    year_built = models.DateField  # should be models.DateField()

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 2023-01-10
    • 2022-12-21
    • 1970-01-01
    • 2021-06-18
    • 2020-03-04
    • 2021-01-19
    • 2021-11-27
    • 2022-01-23
    相关资源
    最近更新 更多