【问题标题】:Django rest framework remove a field from API Create formDjango rest框架从API创建表单中删除一个字段
【发布时间】:2018-09-22 12:39:14
【问题描述】:

我有一个与此模型相关的模型和视图集, 这是我的代码:

class EMAILTemplate(models.Model):
    """ Message SMS Template """
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    body = models.TextField()
    tokens = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs):
        self.tokens = ",".join(re.findall(r'{{\s*(.*?)\s*}}', self.body))
        super().save(*args, **kwargs)

我不希望字段标记出现在我在 Django REST 框架创建或编辑表单中的创建表单中,因为如您所见,它将从正文字段中提取。 但我想在单个模型或模型列表中显示此字段。

这是我的 ModelSerializer :

class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = EMAILTemplate
        fields = ('name', 'body', 'user', 'tokens')

【问题讨论】:

    标签: django python-3.x api django-rest-framework


    【解决方案1】:

    您可以将tokens 指定为只读字段:

    class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = EMAILTemplate
            fields = ('name', 'body', 'user', 'tokens')
            read_only_fields = ('tokens',)
    

    【讨论】:

    • 当我这样做时,我的令牌字段未按预期填写。我的令牌字段应该从正文字段中提取。当我不放你提到的那一行时,令牌字段出现在表单中,无论我填写这个输入,在数据库中它都会填充我期望的值。例如,如果我的身体是“我是 {{first_name}} {{last_name}},我是 {{age}} 岁。”令牌字段值应为:“first_name, last_name, age”
    • @mhndev 这个答案将按原样工作。因为您在 save() 方法中生成tokens
    【解决方案2】:

    你可以覆盖当前的to_representation方法

    class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):
    
        def to_representation(self, obj):
            try:
                if self.context['view'].action in ['list', 'detail']:
                    # get the original representation
                    ret = super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)
                    # remove 'tokens' field
                    ret.pop('tokens')
                    return ret
            except KeyError:
                return super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)
            return super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)
    

    【讨论】:

    • 当我按照你说的做时,不仅字段标记仍然出现在rest框架创建表单中,而且在列表操作中我得到空对象而不是实际的json对象。
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2020-05-15
    • 2016-11-16
    • 2021-02-28
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多