我有一个Django QuerySet,我想从中获取一个Q对象.(即,它与查询集保持完全相同的查询.)
那可能吗?如果是这样,怎么样?
我正在我的Django网站上实现一个简单的LIKE搜索,我目前使用的是以下代码:
from django.db.models import Q
posts = Post.objects.filter(Q(title__icontains=query)|Q(content__icontains=query))
Run Code Online (Sandbox Code Playgroud)
query字符串在哪里.这导致LIKESQL语句并且工作正常.现在,我还想将搜索查询拆分为术语或单词:
words = query.split(' ')
Run Code Online (Sandbox Code Playgroud)
所以words现在包含一个单词列表,我想实现类似于以下的SQL语句:
SELECT ... FROM foo WHERE `title` ILIKE '%word1%' OR `title` ILIKE '%word2%'
OR `content` ILIKE '%word1%' OR `content` ILIKE '%word2%'
Run Code Online (Sandbox Code Playgroud)
如果有两个以上的单词,我希望语句增长,按每个单词列出所有条目.
有任何想法吗?谢谢!
g = Goal.objects.filter(Q(title__contains=term) | Q(desc__contains=term))
Run Code Online (Sandbox Code Playgroud)
我怎样才能添加到我的filter那个user=request.user?
这不起作用:
g = Goal.objects.filter(user=request.user, Q(title__contains=term) | Q(desc__contains=term))
Run Code Online (Sandbox Code Playgroud)
楷模:
class Goal(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=255)
desc = models.TextField()
Run Code Online (Sandbox Code Playgroud) 我有一个动态创建的复杂Q对象.如何否定Q对象以便可以filter()代替exclude()?
我有一个模型:
class Authors(models.Model):
name = models.TextField()
person = models.ForeignKey(Person)
Run Code Online (Sandbox Code Playgroud)
和查询:
authors = Author.objects.filter(
(Q(name__iregex=r"\y{0}\y".format(s1)),
~Q(name__iregex=r"\y{0}\y".format(s2))
),
person=None).order_by('-id')
Run Code Online (Sandbox Code Playgroud)
我收到错误:
'Q' object has no attribute 'split'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我没有使用split()..错误行在此查询行中.
现在我只使用Q(id=0),这取决于数据库。或者也许Q(pk__isnull=True)更好?它对于使用 of|运算符连接 Q 对象很有用。
有什么区别
queryset.filter(Q(foo='bar') | Q(foo='baz'))
Run Code Online (Sandbox Code Playgroud)
和
queryset.filter(foo__in=['bar', 'baz'])
Run Code Online (Sandbox Code Playgroud)
我发现有时他们会产生不同的结果,我无法弄清楚为什么.
我对这些查询得到了不同的结果:
In [8]: Profile.objects.filter(image="").count()
Out[8]: 7173
In [9]: Profile.objects.filter(image=None).count()
Out[9]: 25946
In [10]: Profile.objects.filter(image__in=["", None]).count()
Out[10]: 7173
In [11]: Profile.objects.filter(Q(image="") | Q(image=None)).count()
Out[11]: 33119
Run Code Online (Sandbox Code Playgroud)
我正在使用PostgreSQL作为我的数据库引擎.
我想以查询项来自变量的方式使用 django.db.models.Q 对象。
我想要实现的目标与此相同:
q = Q(some_field__icontains='sth')
Obj.objects.filter(q)
Run Code Online (Sandbox Code Playgroud)
,但 some_field 值应该来自变量:
field_name='some_field'
q = Q('%s__icontains=sth' % field_name)
Obj.objects.filter(q)
Run Code Online (Sandbox Code Playgroud)
,但是这个解决方案当然不会给我正确的结果。
我也尝试这样使用字典:
dt = {'%s__icontains' % field_name: 'sth'}
q = Q(**dt)
Obj.objects.filter(q)
Run Code Online (Sandbox Code Playgroud)
,但这在结果上也失败了。
如何使用变量作为查询项来使用 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对象是否存在固有的性能影响
我有这些模型:
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为空?)