在我的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 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) 我正在执行一个查询,该查询将一堆 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对象是否存在固有的性能影响
我有这些模型:
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为空?)
我正在寻找创建一个稍微复杂的查询,使用原始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中实现这一目标.
有小费吗?
谢谢
我正在使用看起来像这样的查询:
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()所以我不知道如何修改它.
感谢您提供的任何输入!
# 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中,我一无所获!
我似乎找不到任何资源来解释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)
这似乎没有丢弃我的数据库.这里发生了什么?
我正在 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) 示例模型:
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 ×10
django-q ×10
python ×5
django-orm ×2
sql ×2
filter ×1
orm ×1
pycharm ×1
python-3.7 ×1
security ×1