如何根据传递的参数更改QuerySet中字段的返回值?

时间:2014-10-16 22:42:41

标签: django

我希望能够根据参数从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要么返回存储在数据库中的文本值,要么返回一个空字符串(或'hidden'或类似的)。

模板过滤器可以工作,但它确实需要在模型中。

我不确定如何通过参数使其正常工作。

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

1 个答案:

答案 0 :(得分:0)

Manager模型定义SomeDetails类:

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)作为最后一部分。