model - 返回文字 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__
其所有字段作为字符串返回的方法,然后将大括号也作为字符串放在输出周围,但是必须有更好的方法来做到这一点?
解决方案
作为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')
您可以从此处找到有关可写嵌套序列化程序的更多详细信息。
推荐阅读
- javascript - Object.create({}) 之间的区别 {}
- primefaces - Mojarra 上的 PrimeFaces TreeTable 问题
- sql - 根据 Teradata SQL 中另一列的最大值查找列计数
- sql - 将带有内部连接的更新查询从 vba 转换为 SQL Server
- php - preg_match_all 返回空数组
- java - 如何根据 Spinner 的选择将纯文本视图添加到当前布局?
- python - 什么是 Python 等价于 C# 的 ContinueWith()
- javascript - 使用 apache cordova 在服务器上上传多个视频和图像
- c# - WPF Content Presenter 奇怪的水平对齐行为
- nginx - 禁用 nginx 的 index.html