我希望能够根据参数从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'或类似的)。
模板过滤器可以工作,但它确实需要在模型中。
我不确定如何通过参数使其正常工作。
我觉得答案就在我面前,但我只是没有看到它。
答案 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)
作为最后一部分。