尽管已经阅读了关于这个主题的几件事,但我发现自己陷入困境。 我有一个Django Rest框架应用程序。我有这个模型:
class MyModel(Model):
name = CharField(_('name'), max_length=50)
type = CharField(_('type'), max_length=50)
users_selected = ManyToManyField(User)
我试图序列化。我不想暴露users_selected,因为它拥有选择此特定模型的应用程序的所有用户,但只要能够为当前用户选择布尔说法,我通过这样做实现了:
class MySerializer(ModelSerializer):
is_selected = SerializerMethodField('user_select')
def user_select(self, obj):
request = self.context['request']
return obj.users_selected.filter(id=request.user.id).exists()
class Meta(object):
model = MyModel
exclude = ('users_selected',)
这工作正常,但现在我想以相反的方式做到这一点,这意味着我希望我的客户端能够将带有is_selected设置的请求发送到true或false,然后相应地修改我的users_selected。 SerializerMethodField意味着这是一个只读字段。 我该怎么做到这一点?我尝试使用restore_object方法进行搜索,但无法实现任何目标......
感谢。
答案 0 :(得分:0)
对我来说,让MyModel指向所有选择它的用户感觉有点奇怪。如果您将用户子类化,并将自定义用户的外键或ManyToManyField分配给所选的MyModel,则会更简单。
如果你这样做,一个用户可以访问他自己的选择,并且没有权限问题。有人需要直接从MyModel对象访问用户的唯一时间是管理工作,此时公开列表中的所有用户是完全正常的。你甚至可以有一个单独的视图,比如MyModelUsersSelected,它看起来像:
class MyModelUsersSelected(generics.ListAPIView):
serializer_class = UserSerializer
permission_classes = (permissions.IsAdminUser,)
def get_queryset(self):
return MyModel.objects.get(id=self.kwargs['pk']).user_set.all()
这将为您提供指向在url中作为pk传递的MyModel实例的所有用户。由于此视图与MyModel和User视图分开,因此权限只能设置为admin用户。