拥有资源过滤器在django rest框架中

时间:2014-04-30 13:43:45

标签: django django-rest-framework

我有一个简单的DRF应用程序,用于管理数据库/用户。

我有正常的Django用户。 每个用户都可以“拥有”一组架构(数据库) 每个用户都可以“拥有”一组DatabaseUsers(与Django用户不同) Schema和DatabaseUsers之间存在许多关系(Schema有许多DatabaseUser,DatabaseUser可以访问许多模式)。 但Schemas和DatabaseUsers归单个Django用户所有。

这在JSON视图中完全正常 - 我有适当的过滤器,以便用户只能访问自己的Schema或DatabaseUsers。

但是,在使用Web API时,当用户创建新架构时,DRF会帮助列出系统中的所有DatabaseUser供他们选择,而不仅仅是他们自己的用户:

Too many users listed here 在上图中,userA_dbUser1,2,3由userA拥有,因此userB不应该可见。我不知道DRF是如何填充此信息的,因为它似乎没有通过序列化程序。 如何阻止DRF Web API列出属于其他用户的DatabaseUser。

模型:

class DatabaseUser(models.Model):
    owner = models.ForeignKey('auth.User')
    name = models.CharField(max_length=128, primary_key=True)
    def __str__(self):
        return self.name

class Schema(models.Model):
    owner = models.ForeignKey('auth.User')
    title = models.CharField(max_length=100, primary_key=True)
    breed = models.ForeignKey('schema.Breed')
    users = models.ManyToManyField(DatabaseUser)
    def __str__(self):
        return "%s (%s)" % (self.title, self.breed)

的观点:

class SchemaMixin(object):
    queryset = Schema.objects.all()
    serializer_class = SchemaSerializer
    def get_queryset(self):
        # Only list the objects that are owned by the current user
        return Schema.objects.filter(owner = self.request.user)

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

class SchemaList(SchemaMixin, ListCreateAPIView):
    pass

class SchemaDetail(SchemaMixin, RetrieveUpdateDestroyAPIView):
    pass

1 个答案:

答案 0 :(得分:1)

亲爱的未来的人们。上面的schillingt1链接引导我找到解决方案。这是您需要添加到序列化程序的代码:

class SchemaSerializer(serializers.ModelSerializer):
    ...

    def get_fields(self, *args, **kwargs):
        # Override this method so that the list of DatabaseUsers presented in the browseable API
        # is restricted to the DatabaseUsers owned by the current user.
        fields = super(SchemaSerializer, self).get_fields(*args, **kwargs)
        view = self.context['view']
        owner = view.request.user
        fields['users'].queryset = fields['users'].queryset.filter(owner=owner)
        return fields