【发布时间】:2014-04-30 13:43:45
【问题描述】:
我有一个简单的 DRF 应用程序,用于管理数据库/用户。
我有我的普通 Django 用户。 每个用户都可以“拥有”一组模式(数据库) 每个用户都可以“拥有”一组 DatabaseUser(与 Django 用户不同) Schema 和 DatabaseUser 之间存在多对多的关系(一个 Schema 有多个 DatabaseUser,一个 DatabaseUser 可以访问多个 schema)。 但是 Schemas 和 DatabaseUsers 由单个 Django 用户拥有。
这一切在 JSON 视图中工作得非常好——我有适当的过滤器,以便用户只能访问他们自己的模式或数据库用户。
但是,在使用 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
【问题讨论】:
-
查看这篇文章。您应该能够在 get_fields groups.google.com/forum/?fromgroups=#!searchin/… 中覆盖该字段的查询集
-
非常好 - 谢谢schillingt。这样就完成了。但是有一个问题,我覆盖的 get_fields 方法被调用了 3 次。这正常吗?我原以为它只会被调用一次。
-
老实说,我不确定,但我猜是这样。
标签: django django-rest-framework