Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过django会话中存储的属性限制django外键选择_Python_Django_Session Variables - Fatal编程技术网

Python 如何通过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

我有一个用django实现的小应用程序,我遇到了一个小小的挑战。我试图通过特定属性限制应用程序中关系的查询集。现在的问题是,在用户登录到应用程序之前,不知道属性的确切值。例如,限制用户特定公司的一组评论,并且只有在用户登录时才能确定公司。我不知道如何在django视图之外找到当前会话。感谢您的帮助。谢谢

这是我的应用程序中的一个模型示例

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
中的代码也在管理器中工作。不要弄干。