【问题标题】:Django: running a method on all queryset objectsDjango:在所有查询集对象上运行一个方法
【发布时间】:2013-01-31 23:54:46
【问题描述】:

我想知道以下是否可行以及是否有人可以解释如何。我正在使用Django REST Framework

我有一个模型,在那个模型中我有一个名为 Product 的类。产品具有名为 is_product_safe_for_user 的方法。它需要用户对象和自我(产品)。

model.py

class Product(models.Model):

    title = models.CharField(max_length=60, help_text="Title of the product.")
    for_age = models.CharField(max_length=2,)

    def is_product_safe_for_user(self, user):
        if self.for_age > user.age
        return "OK"

(忽略上面的语法,只是给你一个想法)

我想做的是对所有查询集对象运行该方法,如下所示,但我不知道如何...

class ProductListWithAge(generics.ListAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    model = Product
    serializer_class = ProductSerializer

    def get_queryset(self):

      Product.is_product_safe_for_user(self,user)

       # then somehow apply this to my queryset

        return Product.objects.filter()

有时我只想在一个对象上运行方法。

还是应该进入序列化器?如果有怎么办?...

class ProductSerializer(serializers.ModelSerializer):

    safe = serializers.Field(Product='is_product_safe_for_user(self,user)')

    class Meta:
        model = Product
        fields = ('id', 'title', 'active', 'safe')

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以为您的模型写一个custom manager。像这样的:

    class OnlySafeObjects(models.Manager):
        def filter_by_user(self, user):
            return super(OnlySafeObjects, self).get_query_set().filter(for_age__gte=user.age)
    
    class Product(models.Model):
         # your normal stuff
         onlysafeobjects = OnlySafeObjects()
    

    然后你会这样使用它:

    safe_products = Product.onlysafeobjects.filter_by_user(request.user)
    

    【讨论】:

    • 那么这是否意味着如果我要打印出所有我将拥有 item.onlysafeobjects 的产品?还有我将如何传递用户(在我的 url 中传递)
    • 该示例向您展示了如何传递用户。自定义管理器就像整个表的过滤器。您使用管理器访问的内容已为您过滤。您应该阅读我链接的文档,以更好地了解经理是什么。
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2011-05-06
    • 2011-07-04
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多