DRF serializer change field to read_only for some model instances

自闭症网瘾萝莉.ら 提交于 2019-12-23 22:07:32

问题


I have this model:

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

And serializer:

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

I want to make fields 'start_date' and 'finish_date' to become read_only if is_stage property is True. How can I do that?


回答1:


Try to override __init__() method like this:

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



回答2:


Also the same result can be achieved with:

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


来源:https://stackoverflow.com/questions/52424854/drf-serializer-change-field-to-read-only-for-some-model-instances

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!