自定义字段Django Rest Framework

时间:2014-07-29 14:05:49

标签: python django django-rest-framework

尽管已经阅读了关于这个主题的几件事,但我发现自己陷入困境。 我有一个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方法进行搜索,但无法实现任何目标......

感谢。

1 个答案:

答案 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用户。