【问题标题】:How to make an attribute read-only in serializers in DRF?如何在 DRF 的序列化程序中将属性设置为只读?
【发布时间】:2023-01-24 15:41:35
【问题描述】:
我有一个序列化器。
class MySerializer(serializers.ModelSerializer):
class Meta:
model = models.MyClass
我的模型类是:
class MyClass(models.Model):
employee = models.ForeignKey("Employee", on_delete=models.CASCADE)
work_done = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
我希望 employee 属性是只读的,并且应该只在它的字段中显示这个值:
employee = Employee.objects.get(user=self.request.user)
我怎样才能在序列化器中做到这一点?
【问题讨论】:
标签:
python
django
django-rest-framework
django-views
django-serializer
【解决方案1】:
extra_kwargs = {
'employee': {'read_only': True}
}
【解决方案2】:
您可以通过在序列化程序字段中指定 read_only 属性,使序列化程序中的属性变为只读。
如何在 MySerializer 类中将 employee 属性设置为只读的示例:
class MySerializer(serializers.ModelSerializer):
employee = serializers.SerializerMethodField()
class Meta:
model = models.MyClass
fields = ('employee', 'work_done', 'created_at', 'updated_at')
def get_employee(self, obj):
request = self.context.get("request")
employee = Employee.objects.get(user=request.user)
return employee.id
在此示例中,我使用了 SerializerMethodField 并定义了一个方法 get_employee,它使用 request.user 从请求对象中检索当前用户并返回员工的 ID,因此它将是只读的。
此外,您只能通过在 Meta 类中指定字段来显示所需的字段。
如果您有任何其他问题,请告诉我。对于我之前的回复造成的混乱,我再次表示歉意。