【问题标题】:Owned Resources filters in django rest frameworkdjango rest框架中的拥有资源过滤器
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2013-05-25
    • 1970-01-01
    • 2012-12-24
    • 2017-05-27
    • 1970-01-01
    • 2017-10-26
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多