python - DRF 序列化器将某些模型实例的字段更改为 read_only

标签 python django serialization django-rest-framework

我有这个模型:

class Task(MPTTModel, TimeStampedModel, StartFinishModel):
    name = models.CharField(max_length=256)
    parent = TreeForeignKey('self',
                            on_delete=models.CASCADE,
                            related_name='children')
    start_date = models.DateField()    
    finish_date = models.DateField()
    @property
    def is_stage(self):
        if self.get_children():
            return True
        return False

和序列化器:

class TaskBaseSerializer(StartFinishSerializer, TimeStampedSerializer):
    class Meta:
        model = Task
        fields = ('id', 'name', 'parent', 'start_date', 'finish_date', 'is_stage')    
        read_only_fields = ('is_stage')

如果 is_stage 属性为 True,我希望将字段 'start_date''finish_date' 设为 read_only >。我怎样才能做到这一点?

最佳答案

尝试重写 __init__() 方法,如下所示:

class TaskBaseSerializer(StartFinishSerializer, TimeStampedSerializer):
    class Meta:
        model = Task
        fields = ('id', 'name', 'parent', 'start_date', 'finish_date', 'is_stage')    
        read_only_fields = ('is_stage')

    def __init__(self, *args, **kwargs):
        super(TaskBaseSerializer, self).__init__(*args, **kwargs)
        if self.instance and getattr(self.instance, 'is_stage', None):
            self.fields['start_date'].read_only = True
            self.fields['finish_date'].read_only = True

关于python - DRF 序列化器将某些模型实例的字段更改为 read_only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424854/

相关文章:

Django React CSRF 问题

javascript - 如何将数据从服务器自动重定向到客户端

c++ - 使用 Protocol Buffers 更快反序列化的建议

python - 将python打印输出保存到变量

javascript - 从网页中提取提要

python - 类型错误:列表索引必须是整数,而不是元组,怎么了

python - 仅生产 : sometimes get 403 CSRF verification failed

python - 将 Python 二进制模块安装到 Windows 中的自定义位置

json - 部分序列化结构的最佳方法是什么?

c# - 为什么序列化类中的 Random 实例会重复生成同一组数字?