Django REST Framework-在ModelSerializer

时间:2019-02-23 21:44:56

标签: django-rest-framework field

说我有以下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模型字段中复制它们,所以我搞砸了?还是诀窍是重写此逻辑?我尝试过但找不到。

1 个答案:

答案 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逻辑进行确定。