【问题标题】:DRF: TypeError: <Model: Model object> is not JSON serializableDRF: TypeError: <Model: Model object> 不是 JSON 可序列化的
【发布时间】:2016-12-15 03:57:04
【问题描述】:

我在使用 django-rest-framework ModelViewset create(self, request) 方法从请求中获取对象数据时遇到问题。

这是我的model.py

class Heat(models.Model):

    # Relationship Fields
    animal = models.ForeignKey(
                   Animal, related_name='heats', 
                   on_delete=models.CASCADE
             )

    # Fields
    performer = models.CharField(max_length=25)
    is_bred = models.BooleanField(default=False)
    note = models.TextField(max_length=250, blank=True, null=True)

这是我的serializers.py

class HeatSerializer(serializers.ModelSerializer):

    class Meta:
        model = Heat
        fields = [
            'id',
            'animal',
            'performer',
            'is_bred',
            'note',
        ]

这里是我们可以在我的 ModelViewset 中找到错误的地方:

class HeatViewSet(viewsets.ModelViewSet):
    queryset = Heat.objects.all()
    serializer_class = HeatSerializer

    @transaction.atomic
    def create(self, request):
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            print serializer.validated_data['animal']

如果你看这行代码:

// this purpose is to print the actual value of an animal object 
// but it gave me the TypeError: <Animal: Animal object> is not JSON serializable.
print serializer.validated_data['animal'] 

如果我们包含这个,它就可以正常工作,因为它只是一个普通字段,与另一个字段相同,除了作为关系字段的动物:

 print serializer.validated_data['performer']

现在,当我这样做时,对象被直接保存到数据库中。

serializer.save()

但是 django 会提示我 SAME TYPE ERROR!

删除整个create(self, request) 时,方法流程运行良好且不会出现错误,但我想在create(self, request)! 中执行许多查询。这也不对,请帮忙!

【问题讨论】:

  • 你需要为Animal类写一个序列化器并添加到HeatSerializer
  • 我在HeatSerializer 中做了animal = AnimalSerializer 仍然无法工作
  • 喜欢吗? animal = AnimalSerializer(source='animal_set', many=True, read_only=True)
  • 我做了,但 django-rest-framework 中的动物消失了,django 视图提示我 KeyError: 'animal'
  • 哪个 DRF 版本?

标签: python json django django-rest-framework


【解决方案1】:

当您在 Queryset 上进行序列化时,JSON 结果将存储到 .data 对象中

animal = AnimalSerializer(your_model.animal_set(), many=True, read_only=True)
return Response(animal.data)

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2011-09-17
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2019-02-08
    • 2013-05-11
    相关资源
    最近更新 更多