2014-10-16 51 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

相关问题