gpt4 book ai didi

python - 序列化器上的 Django verbose_name 属性

转载 作者:太空宇宙 更新时间:2023-11-03 14:03:39 32 4
gpt4 key购买 nike

我正在使用 django rest 框架为 angular cli 构建 API 后端,但我不知道如何访问 verbose_name 的模型字段属性以对其进行序列化。这是我的代码:

models.py
class MyModel(model.Models):
myField = models.CharField(verbose_name='My Verbose Name')
# Here I have other 30 fields

这是这个模型的序列化器

serializers.py
class MyModelSerializer(ModelSerializer):
myField = SerializerMethodField()

def get_myField(self, obj):
field = next(f for f in obj._meta.fields if f.name == 'myField')
myField= {
'verbose_name': field.verbose_name.title(),
'value': obj.myField
}
return myField
# Do I Have to repeat this function for every field on my Model in order to have verbose-name ??

class Meta:
model = MyModel
fields = ['nominativo' ]

我的观点是:

class MyModelListAPIView(ListAPIView):
queryset = Archivio.objects.all()
serializer_class = MyModelSerializer

我的输出就像我想要的那样:

[
{
"myField":
{
"verbose_name":"My Verbose Name",
"value":"My Field value"
}
}
]

但这对于只有几个字段是没问题的。在我的例子中,我需要有一个像这样的输出,其中包含我的模型的 30 个字段。除了在我的 ModelSerializer 类上制作 30 个 get_field 函数之外,还有更好的解决方案吗?

最佳答案

我认为使用字段本身(将表示更改为对象)可能不是实现所需内容的最佳方式(肯定不是最简单的方式)。

相反,我会尝试定义自动生成“标签”字段的 ModelSerializer,例如(基本实现):

from rest_framework import serializers
from rest_framework.fields import SerializerMethodField


class MyModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(MyModelSerializer, self).__init__(*args, **kwargs)

if 'labels' in self.fields:
raise RuntimeError(
'You cant have labels field defined '
'while using MyModelSerializer'
)

self.fields['labels'] = SerializerMethodField()

def get_labels(self, *args):
labels = {}

for field in self.Meta.model._meta.get_fields():
if field.name in self.fields:
labels[field.name] = field.verbose_name

return labels

然后,如果您使用 MyModelSerializer 而不是 serializers.ModelSerializer,您将获得如下输出:

{
'name': 'Test',
'email': 'test@test.com',
'labels': {
'name': 'Full name',
'email': 'Email address'
}
}

这样,django rest framework 生成的所有字段的逻辑保持不变,并且您有另一个只读字段。漂亮干净。

关于python - 序列化器上的 Django verbose_name 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46078951/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com