【问题标题】:How to create a mixin pattern in Python如何在 Python 中创建混合模式
【发布时间】:2014-07-05 10:06:23
【问题描述】:

我正在尝试使用以下示例来理解 mixins 的概念:

我有一个使用 DRF 的简单序列化程序:

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Test
        fields = ('url', 'name', 'user')

我想创建一个 mixin,通过添加检查用户是否拥有对象并仅显示这些项目来增强(覆盖类 get_queryset)任何自定义序列化程序...

def get_queryset(self):
        """
        This view should return a list of all the items
        for the currently authenticated user.
        """
        user = self.request.user
        return ???????.objects.filter(user=user)

所以我的 TestSerializer 看起来像这样:

class TestSerializer(serializers.ModelSerializer, UserListMixin):
    etc

和 UserListMixin:

class UserListMixin(object):
    """
    Filtering based on the value of request.user.
    """

    def get_queryset(self, *args, **kwargs):
        """
        This view should return a list of all the purchases
        for the currently authenticated user.
        """
        user = self.request.user
        return super([?????????], self).get_queryset(*args, **kwargs).filter(user=user)

我遇到的困难是创建 UserListMixin 类。如何根据我扩展 return [OBJECT].objects.filter(user=user) 的内容返回正确的对象,这种方法是否有效?

【问题讨论】:

标签: python django-rest-framework mixins


【解决方案1】:

过滤器是可链接的,所以这里最好的办法是调用 super 方法来获取默认查询集,然后在顶部添加您的过滤器:

def get_queryset(self, *args, **kwargs)
    user = self.request.user
    return super(UserListMixin, self).get_queryset(*args, **kwargs).filter(user=user)

【讨论】:

  • 嗨丹尼尔,这是有道理的。但是就 mixin 而言,当超级 TestSerializer 可以附加到任何序列化器上时,我该如何返回它?
  • 这就是 Python 中子类化的工作方式——super(class, self) 总是按照方法解析顺序调用下一个类,无论它是什么。请参阅 Raymond Hettinger 的文章 Super considered super
  • 更新了 OP:UserListMixin。也许我没有正确理解这一点:(
  • 好吧,我错了,应该是UserListMixin。
  • 是的,有一个警告:mixin 需要在继承声明中首先列出:class TestSerializer(UserListMixin, serializers.ModelSerializer)。那是因为它总是使用找到的 first 方法。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 2013-05-29
  • 2020-10-18
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多