说我有以下Model
:
class Book(Model):
title = CharField(verbose_name="Book title")
和一个ModelSerializer
:
class BookSerializer(ModelSerializer):
class Meta:
model = Book
fields = "__all__"
我想要一个函数get_verbose_names
,该函数返回模型中字段的详细名称。这是我到目前为止的内容:
def get_verbose_names(serializer):
return [field.label for field in serializer.get_fields().values()]
它似乎工作正常,但是当我将其用于内置User
模型时会出现问题。唯一起作用的字段是ID,电子邮件,活动,超级用户状态和人员状态。这些字段的特别之处在于它们的详细名称与名称不同。 Django REST Framework可能隐藏了一个超级逻辑,该逻辑会对此进行检查,并在这种情况下拒绝将字段标签设置为其冗长的名称。
Django REST Framework的字段是否将冗长的名称隐藏在某个地方,或者它们根本不从原始Django模型字段中复制它们,所以我搞砸了?还是诀窍是重写此逻辑?我尝试过但找不到。
答案 0 :(得分:0)
Django REST Framework确实具有提到的“超级逻辑”。它是needs_label
中的函数utils.field_mapping
:
def needs_label(model_field, field_name):
"""
Returns `True` if the label based on the model's verbose name
is not equal to the default label it would have based on it's field name.
"""
default_label = field_name.replace('_', ' ').capitalize()
return capfirst(model_field.verbose_name) != default_label
绕过此烦人功能的最简单方法可能是执行以下操作:
def get_verbose_names(serializer):
return [field.label or name.replace("_", " ").capitalize()
for name, field in serializer.get_fields().items()]
用语言解释,检查字段标签,如果没有为其自动生成,请使用needs_label
逻辑进行确定。