标签: django-q

过滤使用Q对象与动态来自用户?

在我的views.py中,我有一个方法:

#......
def get_filter_result(self, customer_type, tag_selected):
        list_customer_filter=[]
        customers_filter = Customer.objects.filter(Q(type__name=customer_type),
                                                   Q(active=True),
                                                   Q(tag__id=tag_selected))

        for customer_filter in customers_filter:
                    customer_filter.list_authorize_sale_type = sale_type_selected(customer_filter.authorize_sale_type)
                    list_customer_filter.append(customer_filter)
        return list_customer_filter
Run Code Online (Sandbox Code Playgroud)

**我的案例tag_selected是用户选中的复选框值我遇到了tag_selected(是列表= 1,2,3,...)从我的网址传递的问题

/?customer_type=TDO&tag=2 ===>filter okay
/?customer_type=TDO&tag=3 ===>filter okay
?customer_type=TDO&tag=2,3 ===>How Can I add And condition in filter?
Run Code Online (Sandbox Code Playgroud)

例如

if len(tag_selected)==1:
      customers_filter = Customer.objects.filter(Q(type__name=customer_type),
                                                       Q(active=True),
                                                       Q(tag__id=tag_selected))
else:
    customers_filter = Customer.objects.filter(Q(type__name=customer_type),
                                                       Q(active=True),
                                                       Q(tag__id=tag_selected[0])
                                                       Q(tag__id=tag_selected[1])
                                                       Q(tag__id=tag_selected[2])
                                                       ...
                                                        )
Run Code Online (Sandbox Code Playgroud)

django django-q

5
推荐指数
1
解决办法
2147
查看次数

是否可以在构造后修改Django Q()对象?

是否可以在构造后修改Django Q()对象?我创建一个Q()对象,如下所示:

q = Q(foo=1)
Run Code Online (Sandbox Code Playgroud)

以后可能会改变q成我构造的那样:

q2 = Q(foo=1, bar=2)
Run Code Online (Sandbox Code Playgroud)

?在Django文档中没有提到我能找到的这样的接口.

我在寻找类似的东西:

Q.append_clause(bar=2)
Run Code Online (Sandbox Code Playgroud)

python django django-orm django-q

5
推荐指数
2
解决办法
170
查看次数

django 查询中 or-ing Q 对象的性能影响

我正在执行一个查询,该查询将一堆 Q 组合在一起,这似乎花费了很多时间。这是一些伪代码

query_params = []
for i in range(80): #there are about 80ish Q objects being created
    query_params.append(Q(filter_stuff))
Run Code Online (Sandbox Code Playgroud)

然后我或他们一起

query_params = reduce(or_, query_params)
Run Code Online (Sandbox Code Playgroud)

当我执行查询时

query = list(MyModel.objects.filter(query_params))
Run Code Online (Sandbox Code Playgroud)

它挂了很长时间。我知道这是一个非常普遍的问题,如果不深入了解数据结构,就很难给出诊断(这里很难给出)。但我只是好奇Qdjango 查询中的 or-ing对象是否存在固有的性能影响

python sql django django-q

5
推荐指数
1
解决办法
997
查看次数

Django CheckConstraint:反向外键查找的元素不能为空

我有这些模型:

class Container(models.Model):
    ...
    class Meta:
        constraints = [
            models.CheckConstraint(
                 check=~Q(elements=None),
                 name='container_must_have_elements'
            ),
        ]

class Element(models.Model):
    container = models.ForeignKey(Container),
        related_name='elements',
        on_delete=models.CASCADE
    )
Run Code Online (Sandbox Code Playgroud)

我想强制每个Container对象必须至少有一个Element通过外键关系引用它的约束。

如您所见,我已经添加了一个检查约束。但是,对象~上的否定运算符Q似乎是被禁止的。django.db.utils.NotSupportedError: cannot use subquery in check constraint当我尝试应用生成的迁移时,我得到了。

如果没有否定运算符,约束似乎是有效的(它只会由于数据完整性错误而失败)。

有没有另一种方法可以表达这个约束,以便它支持CheckConstraint?(例如,有没有办法检查集合是否elements为空?)

django django-models check-constraints django-orm django-q

5
推荐指数
1
解决办法
989
查看次数

使用filter()和Q对象混合的Django ORM查询

我正在寻找创建一个稍微复杂的查询,使用原始SQL很容易编写.以下是raw中查询的示例:

SELECT my,fields FROM sales WHERE is_paid = False OR status ='toship'AND otherfield ='FOO'AND another ='BAR'

这很简单,它生成所有结果为is_paid = False,然后为我的AND匹配生成第二个结果集.

现在我知道了Q对象,我知道有关过滤但是我似乎无法完全理解如何在Django ORM中实现这一目标.

有小费吗?

谢谢

django orm django-q

4
推荐指数
2
解决办法
8704
查看次数

从django Q查询弹出查询?

我正在使用看起来像这样的查询:

    filters = Q(is_default = False)
    # Build the excludes and filters dynamically 
    if cut:
        filters = filters & Q(mailbagstats__num_letters2__gt = int(cut) )
Run Code Online (Sandbox Code Playgroud)

鉴于filters Q查询,我可以查询pop其中一个吗?

我想Q(mailbagstats__num_letters2__gt= int(cut) )从此Q查询中删除查询,以获取新的过滤器.

通常情况下,我使用列表,reduce但这个是通过构造, Q() & Q()所以我不知道如何修改它.

感谢您提供的任何输入!

python django django-q

4
推荐指数
1
解决办法
187
查看次数

使用Django中的Q()动态构建复杂查询

第一个例子:

# ANDing Q objects
q_object = Q()
q_object.add(Q(), Q.AND)

# ORing Q objects
q_object = Q()
q_object.add(Q(), Q.OR)
Run Code Online (Sandbox Code Playgroud)

第二个例子:

>>> import operator
# create a list of Q objects
>>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
# OR
>>> Poll.objects.filter(reduce(operator.or_, mylist))
[<Poll: what shall I make for dinner>, <Poll: what is your favourite meal?>]
# AND
>>> Poll.objects.filter(reduce(operator.and_, mylist))
[]
Run Code Online (Sandbox Code Playgroud)

这种技术可能非常有用,例如,对于使用条件过滤器的页面构建查询,就像在eBay上一样.

但是,据我所知,这些事情没有记录,所以这个问题的最佳实践是什么,不会从支持中删除,也不会混淆那些会阅读我代码的人?

ps
而且 - 对Q()对象使用"&"运算符是否很好?在Django-docs中,我一无所获!

python django filter django-queryset django-q

4
推荐指数
1
解决办法
3984
查看次数

Django Q对象(复杂查询)是否安全?

我似乎找不到任何资源来解释Django内置的复杂查询(Q对象或F对象)的安全性.是否可以在这些查询中注入SQL攻击?我做了一个小测试:

from models import *
from django.db.models import Q
q = MyModel.objects.filter(Q(mycolumn__contains='%; DROP DATABASE mydatabase;'))
print q
>>> []
print q.query
>>> SELECT `mydatabase_mytable`.`mycolumn` FROM `mydatabase_mytable` WHERE 
    `mydatabase_mytable`.`mycolumn` LIKE BINARY %\%; DROP DATABASE mydatabase;% 
Run Code Online (Sandbox Code Playgroud)

这似乎没有丢弃我的数据库.这里发生了什么?

python sql security django django-q

4
推荐指数
1
解决办法
357
查看次数

django-q qcluster 在 Pycharm Debug 中运行时启动和退出

我正在 PyCharm 中使用django-q运行 Django 项目。manage.py runserver正在一个实例中运行,并且manage.py qcluster正在另一实例中运行。qcluster启动正常,然后立即优雅退出。全文如下:

/Users/user/PycharmProjects/project/venv/bin/python /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py --multiproc --qt-support=auto --client 127.0.0.1 --port 65362 --file /Users/user/PycharmProjects/project/manage.py qcluster --settings=project.settings.dev
Connected to pydev debugger (build 193.6494.30)
pydev debugger: process 21339 is connecting

16:03:44 [Q] INFO Q Cluster grey-kentucky-georgia-avocado starting.
16:03:44 [Q] INFO Process-1 guarding cluster grey-kentucky-georgia-avocado
16:03:44 [Q] INFO Q Cluster grey-kentucky-georgia-avocado running.
16:03:44 [Q] INFO Process-1:1 ready for work at 21343
16:03:44 [Q] INFO Process-1:2 ready for work at 21344
16:03:44 [Q] INFO …
Run Code Online (Sandbox Code Playgroud)

django pycharm django-q python-3.7

4
推荐指数
1
解决办法
1803
查看次数

使用带有外键的 Q 对象定义 django 查询集

示例模型:

class Book(models.Model):
    title = models.TextField()

class Author(models.Model):
    book = models.ForeignKey(Book)
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

和一些示例数据:

Book:
id  title
1   test111
2   test222
3   test333
4   test444

Author:
book_id  name
1        test111
1        test222
2        test222
2        test333
3        test111
3        test333
4        test111
4        test333
Run Code Online (Sandbox Code Playgroud)

我想获取所有作者姓名包含“111”和“333”的书(因此所有至少有 2 个作者的书:第一个名称为 111,第二个名称为 333)

我可以通过使用链查询来达到这个目标:

books = Book.objects.filter(author__name__icontains="111").filter(author__name__icontains="333")
Run Code Online (Sandbox Code Playgroud)

返回两本书,id 为:3 和 4

有没有办法通过使用 Q 对象来达到上述目标?

django django-queryset django-q

3
推荐指数
1
解决办法
3831
查看次数