我有一个存储玩家详细信息的模型。
class Player(models.Model):
"""
"""
name = models.CharField(max_legth=10, unique=True)
team = models.CharField(max_length=10, unique=True)
type = models.CharField(max_length=10, unique=True)
现在我想通过传递一个字符串值来过滤Player
模型数据,我将匹配所有3列(名称,团队和类型)。
我想在django ORM中编写一个查询,当任何on 3条件匹配时,它将给出结果,如果任何条件匹配,queryset将停止进一步检查。
我的尝试:
from operator import __or__
q = Q(name=input), Q(team=input), Q(type=input)
slots = slots.get(reduce(__or__, q))
但上面的例子并没有正常工作。它返回了我的多对象查询集。
修改
示例:
>>> from base_data.models.booking import Player
>>> Player.objects.create(name='test', team=1, type=2)
<Player: Player object>
>>> Player.objects.create(name=3, team='test', type=2)
<Player: Player object>
>>> Player.objects.create(name=5, team=6, type='test')
<Player: Player object>
>>>
>>> from django.db.models import Q
>>> val = 'test'
>>> Player.objects.filter(Q(name=val))
[<Player: Player object>]
>>> Player.objects.filter(Q(name=val) | Q(team=val) | Q(type=val))
[<Player: Player object>, <Player: Player object>, <Player: Player object>]
>>> # above result should return me first player model instance when name==val.
>>># it should break and should not check next conditions.
我使用的是sqlite3。
现在的解决方案:
out = Player.objects.filter(name=input) or Player.objects.filter(team=input) or Player.objects.filter(type=input)
答案 0 :(得分:1)
我认为您应该在查询中使用distinct()。
答案 1 :(得分:0)
如果满足第一个条件,则可以使用这种方式进行中断检查,无论数据库是否命中,无论代码是否混乱。
query_string = "test"
players = Player.objects.filter(name=query_string)
if players.count() == 0:
players = Player.objects.filter(team=query_string)
if players.count() == 0:
players = Player.objects.filter(type=query_string)
if players.count() == 0:
# you don't have results
else:
# you have results
此外,从DB的角度考虑它。您永远无法编写一个符合您条件的SQL查询!
SELECT * FROM players where name = "test" OR type = "test" or team = "test"
这将获得相同的结果,因为它是OR条件。
Django永远不会知道并且永远无法理解是否满足第一个条件,至少没有达到数据库。