python - 创建时向 django-rest-framework ModelViewSet 添加其他字段的最佳方法

标签 python django rest django-rest-framework

我有一个带有用户(图书所有者)外键的 Book 模型:

class Book(models.Model):
    owner = models.ForiegnKey(User)
    ...

我为 Book 创建了一个 ModelViewSet,它显示了登录用户拥有的书籍:

class BookViewSet(viewsets.ModelViewSet):
    model = Book
    serializer_class = BookSerializer
    def get_queryset(self):
        return Book.objects.filter(owner=self.request.user)

现在要创建一本新书,我想用 request.user 保存用户字段,而不是从其他客户端发送的数据(为了更安全)。例如:

def create(self, request, *args, **kwargs):
    request.DATA['user'] = request.user
    ... (some code to create new Book from request.DATA using serialize class)

但是我得到了这个错误: 这个 QueryDict 实例是不可变的。 (意味着 request.DATA 是一个不可变的 QueryDict,无法更改)

你知道在使用 django rest 框架创建对象时添加额外字段的更好方法吗?

最佳答案

更新:从 v3 开始,您需要这样做:

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)

原理是一样的。


您想将图书序列化程序的 owner 字段设置为只读,然后在 pre_save() 中设置与用户的关联。

类似于:

def pre_save(self, obj):
    obj.owner = self.request.user

参见 tutorial section on "Associating Snippets with Users" .

希望对您有所帮助。

关于python - 创建时向 django-rest-framework ModelViewSet 添加其他字段的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18571157/

相关文章:

python - 如何修改 Django Admin 上的选择

python - 如何保护目录?以及如何在用户注册时创建新目录?

python - 使用reportlab和django框架在一个pdf文件中生成多个二维码

python - Django - 以geoJSON格式获取多边形的质心

web-services - 创建一对一的 RESTful API 关系

python - Django : Timeout when reading response headers from daemon process 的 mod_wsgi 错误

python - 如何加载经过训练的 tensorflow 模型

python - 在 docker 容器中安装 m2crypto

javascript - 使用自定义端点扩展现有 API

asp.net - 使用 .Net 2.0 框架的 REST 服务和 JavaScript 中的 REST 消费