【问题标题】: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 类中指定字段来显示所需的字段。

      如果您有任何其他问题,请告诉我。对于我之前的回复造成的混乱,我再次表示歉意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        相关资源
        最近更新 更多