2013-02-15 71 views
1

我想知道以下是否可能,以及是否有人可以解釋如何。我正在使用Django REST FrameworkDjango:在所有查詢集對象上運行方法

我有一個模型,在該模型中我有一個類叫做產品。產品具有稱爲的方法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() 

還會有一些時候,我想只在一個對象上運行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') 

回答

5

你可以寫你的模型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) 
+0

這樣就意味着,如果我打印出的所有產品,我會爲每個item.onlysafeobjects?我怎麼會通過用戶(這是通過我的網址) – Prometheus 2013-02-15 22:48:07

+0

該示例演示如何傳遞用戶。自定義管理器就像整個表格的過濾器。您使用管理器訪問的內容已經過濾。你應該閱讀我鏈接的文檔,以便更好地瞭解管理者是什麼。 – 2013-02-15 22:49:24

相關問題