2014-10-16 12 views
0

我希望能夠根據參數從Queryset(不更改數據庫)返回不同的值。我希望能夠將其寫入模型,以便在任何地方實施。如何根據傳遞的參數更改QuerySet中字段的返回值?

如果用戶是某種類型的用戶,我希望QuerySet字段爲空(或「隱藏」或類似的東西)。

這裏是一個簡化的模型:

class SomeDetails(models.Model): 
    size = models.FloatField() 
    this_is_okay_to_show = models.TextField() 
    not_always_ok = models.TextField() 

簡化查詢集:

qsSomeDetails = SomeDetails.objects.all() 

我想not_always_ok要麼返回存儲在數據庫中的文本值或返回一個空字符串(或「隱藏」或類似)。

模板過濾器可以工作,但它確實需要在模型中。

我不知道如何通過一個參數來使它工作。

我覺得答案就在我面前,但我只是沒有看到它。

回答

0

定義ManagerSomeDetails型號:

class SomeDetailsManager(models.Manager): 
    def __getattr__(self, attr, *args): 
     try: 
      return getattr(self.__class__, attr, *args) 
     except AttributeError: 
      return getattr(self.get_query_set(), attr, *args) 
    def get_query_set(self): 
     return self.model.QuerySet(self.model) 

,改變你的SomeDetails這樣的:

from django.db.models.query import QuerySet 

class SomeDetails(models.Model): 
    size = models.FloatField() 
    this_is_okay_to_show = models.TextField() 
    not_always_ok = models.TextField() 
    objects = SomeDetailsManager() 

    class QuerySet(QuerySet): 
     def get_user(self, user, *args, **kwargs): 
      _objects = self.filter(*args, **kwargs) 
      for obj in _objects: 
       if user.username = 'foo': #change with your condition 
        obj.not_always_ok = '' 
      return _objects 

現在你可以使用

qsSomeDetails = SomeDetails.objects.filter(pk=1).get_new_objects(request.user) 

注:

首先完成所有過濾器並使用get_new_objects(request.user)作爲最後一部分。

+0

我不應該在我的示例模型中包含「用戶」。我正在尋找登錄用戶的條件,而不是來自模型的用戶。我將編輯我的示例。 如何根據發出請求的用戶(request.user)獲取「user_has_condidtion」進行評估?我想這就是我正在努力的部分。我知道我錯過了一些恰到好處的東西。我如何獲得該參數以在運行時進行評估。 – user791770 2014-10-17 00:34:13

+0

@ user791770檢查我的編輯。你在'get_new_objects'中訪問請求的用戶對象。 – 2014-10-17 20:44:25

+0

這有效,但如果我添加一個篩選器到返回的查詢集,它會恢復到原始值。 SomeDetails.objects.get_new_objects(request.user).filter(pk = 1)返回原始值,而不是掩碼/隱藏值。 – user791770 2014-10-17 23:19:06

相關問題