我有一个简单的DRF应用程序,用于管理数据库/用户。
我有正常的Django用户。 每个用户都可以“拥有”一组架构(数据库) 每个用户都可以“拥有”一组DatabaseUsers(与Django用户不同) Schema和DatabaseUsers之间存在许多关系(Schema有许多DatabaseUser,DatabaseUser可以访问许多模式)。 但Schemas和DatabaseUsers归单个Django用户所有。
这在JSON视图中完全正常 - 我有适当的过滤器,以便用户只能访问自己的Schema或DatabaseUsers。
但是,在使用Web API时,当用户创建新架构时,DRF会帮助列出系统中的所有DatabaseUser供他们选择,而不仅仅是他们自己的用户:
在上图中,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
答案 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