Mik*_*keN 608 python django django-models django-queryset
在Django模型QuerySets中,我看到有一个__gt
和__lt
for的比较值,但是有__ne
/ !=
/ <>
(不等于?)
我想用不等于过滤掉:
例:
Model:
bool a;
int x;
Run Code Online (Sandbox Code Playgroud)
我想要
results = Model.objects.exclude(a=true, x!=5)
Run Code Online (Sandbox Code Playgroud)
在!=
不正确的语法.我试过__ne
,<>
.
我最终使用:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
Run Code Online (Sandbox Code Playgroud)
Dav*_*ogt 637
也许Q对象可以帮助解决这个问题.我从来没有使用它们,但似乎它们可以被否定和组合,就像普通的python表达式一样.
更新:我刚试了一下,看起来效果很好:
>>> from myapp.models import Entry
>>> from django.db.models import Q
>>> Entry.objects.filter(~Q(id = 3))
[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]
Run Code Online (Sandbox Code Playgroud)
d4n*_*4nt 564
您的查询似乎有一个双重否定,您想要排除x不是5的所有行,所以换句话说,您想要包含x IS 5的所有行.我相信这样做会有所帮助.
results = Model.objects.filter(x=5).exclude(a=true)
Run Code Online (Sandbox Code Playgroud)
要回答你的具体问题,没有"不等于",但这可能是因为django同时具有"过滤"和"排除"方法,因此你可以随时切换逻辑轮以获得所需的结果.
Sin*_*ion 120
field=value
查询中的语法是一种简写field__exact=value
.也就是说,Django将查询运算符放在标识符中的查询字段中.Django支持以下运算符:
exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex
Run Code Online (Sandbox Code Playgroud)
我确信通过将这些与Q对象结合起来,正如Dave Vogt建议和使用的那样,filter()
或者exclude()
正如Jason Baker建议你将得到你所需要的几乎任何可能的查询.
Dmi*_*lov 91
使用Django 1.7创建自定义查找很容易.Django官方文档中有一个__ne
查找示例.
您需要首先创建查找本身:
from django.db.models import Lookup
class NotEqual(Lookup):
lookup_name = 'ne'
def as_sql(self, qn, connection):
lhs, lhs_params = self.process_lhs(qn, connection)
rhs, rhs_params = self.process_rhs(qn, connection)
params = lhs_params + rhs_params
return '%s <> %s' % (lhs, rhs), params
Run Code Online (Sandbox Code Playgroud)
然后你需要注册它:
from django.db.models.fields import Field
Field.register_lookup(NotEqual)
Run Code Online (Sandbox Code Playgroud)
现在您可以在__ne
查询中使用查找,如下所示:
results = Model.objects.exclude(a=True, x__ne=5)
Run Code Online (Sandbox Code Playgroud)
ils*_*005 82
在Django 1.9/1.10中有三个选项.
results = Model.objects.exclude(a=true).filter(x=5)
Run Code Online (Sandbox Code Playgroud)from django.db.models import Q
object_list = QuerySet.filter(~Q(a=True), x=5)
Run Code Online (Sandbox Code Playgroud)注册自定义查找功能
from django.db.models import Lookup
from django.db.models.fields import Field
@Field.register_lookup
class NotEqual(Lookup):
lookup_name = 'ne'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return '%s <> %s' % (lhs, rhs), params
Run Code Online (Sandbox Code Playgroud)
将register_lookup
在加装饰的Django 1.8和可定制的查找和往常一样:
results = Model.objects.exclude(a=True, x__ne=5)
Run Code Online (Sandbox Code Playgroud)Dam*_*ami 40
虽然与模型,您可以用过滤=
,__gt
,__gte
,__lt
,__lte
,你不能使用ne
,!=
或者<>
.但是,您可以使用Q对象实现更好的过滤.
您可以避免链接QuerySet.filter()
和QuerySet.exlude()
,并使用此:
from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')
Run Code Online (Sandbox Code Playgroud)
out*_*ime 15
你应该使用filter
并exclude
喜欢这个
results = Model.objects.exclude(a=true).filter(x=5)
Run Code Online (Sandbox Code Playgroud)
jin*_*iam 15
使用排除和过滤
results = Model.objects.filter(x=5).exclude(a=true)
Run Code Online (Sandbox Code Playgroud)
最后一段代码将排除x!= 5和a为True的所有对象.试试这个:
results = Model.objects.filter(a=False, x=5)
Run Code Online (Sandbox Code Playgroud)
请记住,上面一行中的=符号是为参数a赋值False,为参数x赋值5.它不是在检查是否平等.因此,在查询调用中实际上没有任何方法可以使用!=符号.
这将给出您想要的结果。
from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))
Run Code Online (Sandbox Code Playgroud)
对于不相等,您可以~
在相等的查询中使用。显然,Q
可以用来达到相等查询。
Django-model-values(公开:作者)提供了NotEqual查找的实现,如此答案所示。它还为此提供了语法支持:
from model_values import F
Model.objects.exclude(F.x != 5, a=True)
Run Code Online (Sandbox Code Playgroud)
小智 7
这应该有效
results = Model.objects.filter(x=5).exclude(a=True)
Run Code Online (Sandbox Code Playgroud)
你所寻找的是具有或者所有对象a=false
或 x=5
.在Django中,|
作为查询集OR
之间的运算符:
results = Model.objects.filter(a=false)|Model.objects.filter(x=5)
Run Code Online (Sandbox Code Playgroud)
小智 6
结果= Model.objects.filter(a = True).exclude(x = 5)生成此sql:
从tablex中选择*,其中a = 0且x!= 5sql取决于您的True / False字段的表示方式以及数据库引擎。Django代码是您所需要的。
归档时间: |
|
查看次数: |
337392 次 |
最近记录: |