Python 如何通过django会话中存储的属性限制django外键选择
我有一个用django实现的小应用程序,我遇到了一个小小的挑战。我试图通过特定属性限制应用程序中关系的查询集。现在的问题是,在用户登录到应用程序之前,不知道属性的确切值。例如,限制用户特定公司的一组评论,并且只有在用户登录时才能确定公司。我不知道如何在django视图之外找到当前会话。感谢您的帮助。谢谢 这是我的应用程序中的一个模型示例Python 如何通过django会话中存储的属性限制django外键选择,python,django,session-variables,Python,Django,Session Variables,我有一个用django实现的小应用程序,我遇到了一个小小的挑战。我试图通过特定属性限制应用程序中关系的查询集。现在的问题是,在用户登录到应用程序之前,不知道属性的确切值。例如,限制用户特定公司的一组评论,并且只有在用户登录时才能确定公司。我不知道如何在django视图之外找到当前会话。感谢您的帮助。谢谢 这是我的应用程序中的一个模型示例 class Tax(commons.models.EntityBase): name = models.CharField(blank=False, m
class Tax(commons.models.EntityBase):
name = models.CharField(blank=False, max_length=150)
percentage_value = models.DecimalField(max_digits=4, decimal_places=2)
notes = models.TextField(blank=True, null=True)
auto_apply = models.NullBooleanField()
aggregated_tax = models.NullBooleanField()
def __unicode__(self):
return self.name
每个实体都继承自抽象类
EntityBase
,该类持有属性company
。我想从查询管理器中筛选每个查询,以便它们只返回会话中公司与公司相等的实体。将会话属性、用户或公司等传递给系统不同部分的其他功能完全可以
例如:
def view(request):
user = request.user
filtered_stuff = my_filter_function(..., user = user)
my\u filter\u函数
可以对参数进行过滤,也可以将参数传递给其他函数。将会话属性、用户或公司等传递给系统不同部分的其他函数是完全可以的
例如:
def view(request):
user = request.user
filtered_stuff = my_filter_function(..., user = user)
my\u filter\u函数
可以对参数进行过滤,也可以将参数传递给其他函数。我发现最好的方法是为您的模型使用自定义的QuerySet
和管理器。已被接受的答案,应该让您开始使用此部分。在QuerySet
中,您可以设置一个方法(我更愿意将其称为for_user
),用于为您过滤对象:
class Foo(models.Model):
ts = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, blank=True, null=True)
due_date = models.DateField(auto_now=False)
objects = CustomQuerySetManager()
class QuerySet(QuerySet):
def for_user(self, user):
return self.filter(user=user)
从这里,您的观点相当简单:
def view(request):
user = request.user
mylist = Foo.objects.for_user(user).filter(due_date__lte=datetime.date.today())
我发现最好的方法是为您的模型使用自定义的
QuerySet
和管理器。已被接受的答案,应该让您开始使用此部分。在QuerySet
中,您可以设置一个方法(我更愿意将其称为for_user
),用于为您过滤对象:
class Foo(models.Model):
ts = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, blank=True, null=True)
due_date = models.DateField(auto_now=False)
objects = CustomQuerySetManager()
class QuerySet(QuerySet):
def for_user(self, user):
return self.filter(user=user)
从这里,您的观点相当简单:
def view(request):
user = request.user
mylist = Foo.objects.for_user(user).filter(due_date__lte=datetime.date.today())
再加上杰克的回答,
您的CustomQuerySetManager类似于:
class CustomQuerySetManager(models.Manager):
def get_query_set(self):
return self.model.QuerySet(self.model)
def __getattr__(self, attr, *args):
return getattr(self.get_query_set(), attr, *args)
与编写管理器方法相比,我更喜欢此方法,因为它允许您拥有可链接的函数,因此您可以:
Foo.objects.for_user(user).filter(...)
再加上杰克的回答,
您的CustomQuerySetManager类似于:
class CustomQuerySetManager(models.Manager):
def get_query_set(self):
return self.model.QuerySet(self.model)
def __getattr__(self, attr, *args):
return getattr(self.get_query_set(), attr, *args)
与编写管理器方法相比,我更喜欢此方法,因为它允许您拥有可链接的函数,因此您可以:
Foo.objects.for_user(user).filter(...)
您在哪里使用需要公司过滤器的查询集?这不是在视图中,还是在视图中创建的表单中?发布现有视图和模型。我想在模型的查询集中使用公司过滤器。这意味着我无法访问请求上下文,据我所知,请求上下文仅在视图中可用。您在哪里使用需要公司筛选器的查询集?这不是在视图中,还是在视图中创建的表单中?发布现有视图和模型。我想在模型的查询集中使用公司过滤器。这意味着我没有访问请求上下文的权限,据我所知,请求上下文仅在视图中可用。在这种情况下,我认为在管理器上使用方法而不是创建自定义查询集更有意义。实际上,
CustomQuerySetManager
就是从另一个问题中派上用场的。QuerySet
中的代码也在管理器中工作。不要断章取义。在这种情况下,我认为在管理器上使用方法比创建自定义查询集更有意义。实际上,CustomQuerySetManager
从另一个问题中可以派上用场。QuerySet
中的代码也在管理器中工作。不要弄干。