首页 > 解决方案 > 返回文字 JSON 而不是 __str__ Django Rest Framework

问题描述

每当我在 Django 中声明一个抽象模型以允许嵌套模型时,Django 都会要求我将str声明为该模型的字符串表示形式。我正在编写的应用程序应该是一个返回 JSON 的 API,而不是实际的对象 Django 返回我定义为str的任何内容。

例子:

我的模型:

class SomeModel(models.Model):
  a = models.CharField()
  b = models.CharField()

  def __str__(self):
    return 'some string'

  class Meta:
    abstract = True

父模型:

class ParentModel(models.Model):
  someModel = models.EmbeddedModelField(
    model_container=SomeModel
  )

序列化器:

class ParentSerializer(serializers.ModelSerializer):
  class Meta:
    model = ParentModel
    fields = ('someModel')

看法:

class ParentViewSet(viewsets.ModelViewSet):
  queryset = ParentModel.objects.all()
  serializer_class = ParentSerializer

现在,当我发送一个 Object 时,ParentModel我想发送类似这样的内容:{ someModel: { a: 'something', b: 'something else' } }而不是__str__. 我知道,我可以定义将__str__其所有字段作为字符串返回的方法,然后将大括号也作为字符串放在输出周围,但是必须有更好的方法来做到这一点?

标签: modeldjango-rest-framework

解决方案


作为SomeModel一个抽象模型,DRF 不允许您为该模型创建序列化程序。您可以参考这个答案,其中创建了抽象模型的自定义序列化程序。

如果SomeModel类不是抽象的,您将需要为您的SomeModel类创建一个序列化程序并在您的ParentSerializer类中将其用作可写嵌套序列化程序。所以粗略地说,你需要实现这样的东西:

# serializers.py
class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ('some_fields')

class ParentSerializer(serializers.ModelSerializer):
    someModel = SomeModelSerializer()
    class Meta:
        model = ParentModel
        fields = ('someModel')

您可以从此处找到有关可写嵌套序列化程序的更多详细信息。


推荐阅读