从rest_framework.serializer.Field中的django.db.models.Field继承help_text

问题描述 投票:0回答:2

让我们考虑一下

模型.py

class Foo(models.Model):
    ...
    bar = models.IntegerField(help_text='This is bar')
    baz = models.IntegerField(help_text='This is baz')

序列化器.py

class FooSerializer(serializers.ModelSerializer):
    bar = serializers.IntegerField(min_value=0, max_value=9)

    class Meta:
        model = Foo
        fields = ('bar', 'baz')

在此示例中,FooSerializer 有两个字段:

  • serializers.IntegerField(min_value=0, max_value=9)
  • 巴兹
    serializers.IntegerField(label='This is baz')
    。标签自动继承自 help_text 属性。

出于文档目的,即使我重新定义该字段,我也想inheritshelp_text。在这种情况下,我必须这样做,因为我需要条的最小/最大值。有办法吗?

python django django-rest-framework
2个回答
4
投票

要继承序列化器中模型字段中定义的选项并添加一些额外选项,您需要使用

extra_kwargs
选项。

您需要在序列化器的

extra_kwargs
类中定义一个字典
Meta
。这将允许您在字段上指定任意附加关键字参数。然后,您将不需要在序列化器上显式声明该字段。

extra_kwargs
字典的键将是您要为其添加一些附加参数的字段名称,其值将是包含这些附加关键字参数的字典。

序列化器.py

class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = Foo
        fields = ('bar', 'baz')
        extra_kwargs = {
            'bar': { # add additional arguments for 'bar' field
                'min_value':0, # specify 'min_value' argument 
                'max_value': 9 # specify 'max_value' argument
            }
        }

除了继承模型中指定的默认参数之外,上述方法还将向模型字段添加这些附加参数。


0
投票

我今天遇到了同样的情况,我不想重复模型中定义的所有 help_text 或手动将其添加到每个序列化器中。

按照 Rahul Gupta 建议的解决方案,我编写了以下装饰器:

def serializer_help_text(serializer: Type[serializers.ModelSerializer]) -> Type[serializers.ModelSerializer]:
    """
    Serializer decorator for adding the help texts defined in the model fields.
    """
    model_fields = serializer.Meta.model._meta.get_fields()
    help_text_kwargs = {field.name: {"help_test": field.help_test} for field in model_fields
                       if hasattr(field, "help_test") and field.help_test is not None}
    if not hasattr(serializer.Meta, "extra_kwargs") or not isinstance(serializer.Meta.extra_kwargs, dict):
        serializer.Meta.extra_kwargs = dict()
    for field_name, value in help_text_kwargs.items():
        serializer.Meta.extra_kwargs[field_name].update(value)
    return serializer

用途:

@serializer_help_text
class MySerializer(serializers.ModelSerializer):
    ....

就是这样:)

© www.soinside.com 2019 - 2024. All rights reserved.