首页 文章

django rest serializer中的read_only字段,带有unique_together约束

提问于
浏览
1

我想在默认的django用户模型中使电子邮件字段唯一 . 所以我做到了 unique_together=[('email',)] . 现在在序列化器中我希望它是一个read_only字段 . 但是Django Rest Framework 3.0文档说:

有一种特殊情况,其中只读字段是模型级别的unique_together约束的一部分 . 在这种情况下,序列化程序类需要该字段以验证约束,但用户也不应编辑该字段 . 处理此问题的正确方法是在序列化程序上明确指定字段,同时提供read_only = True和default = ...关键字参数 . 这方面的一个例子是与当前认证的用户的只读关系,该用户与另一个标识符是唯一的 . 在这种情况下,您将声明用户字段,如下所示:user = serializers.PrimaryKeyRelatedField(read_only = True,default = serializers.CurrentUserDefault())

serializers.CurrentUserDefault()表示当前用户 . 我想将默认设置为用户's email . Isn' t serializers.CurrentUserDefault() 等效于 request.user . serializers.CurrentUserDefault().email 正在给出错误 'CurrentUserDefault' object has no attribute 'email' 如何将电子邮件默认设置为用户的电子邮件?

1 回答

  • 2

    这就是 CurrentUserDefault 的文档所说的:

    可用于表示当前用户的默认类 . 为了使用它,在实例化序列化器时,'request'必须作为上下文字典的一部分提供 .

    您可以这样做,也可以在 views 中提供 context data 中传递的电子邮件ID . 覆盖函数 get_serializer_context

    def get_serializer_context(self):
        context = super(YourClass, self).get_serializer_context()
        context['email'] = request.user.email
    
        return context
    

    在你的 views . 你的 view 应该从某个继承级别的 GenericAPIView 扩展 . 现在在 serializer 中,覆盖您的 __init__ 并获取您的电子邮件数据 .

    def __init__(self, instance = None,  data = serializers.empty, *args, **kwargs):
        self.email = kwargs['context']['email']
    

    现在您可以在序列化程序中使用它 .

相关问题