Django:在所有queryset对象上运行方法

Django:在所有queryset对象上运行方法,django,django-rest-framework,Django,Django Rest Framework,我想知道以下是否可行,是否有人能解释一下。我正在使用 我有一个模型,在这个模型中我有一个叫做产品的类。产品具有名为的方法对于用户来说是安全的。它需要用户对象和自身(产品) 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,)

我想知道以下是否可行,是否有人能解释一下。我正在使用

我有一个模型,在这个模型中我有一个叫做产品的类。产品具有名为的方法对于用户来说是安全的。它需要用户对象和自身(产品)

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"
(忽略上面的语法,这只是给你一个想法)

我想做的是对所有queryset对象运行方法,如下所示,但我不知道如何

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()
有时我只想在一个对象上运行methoud

还是应该将其放入序列化程序?如果是,如何进行?…

class ProductSerializer(serializers.ModelSerializer):

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

    class Meta:
        model = Product
        fields = ('id', 'title', 'active', 'safe')
你可以为你的模型写一封信。大概是这样的:

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)
然后你会这样使用它:

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中传递)。该示例向您展示了如何传递用户。自定义管理器就像整个表的过滤器。使用管理器访问的内容已为您筛选。您应该阅读我链接的文档,以便更好地了解经理是什么。