Django queryset返回数据,如果任何条件匹配并中断

时间:2015-07-27 15:25:27

标签: django django-queryset

我有一个存储玩家详细信息的模型。

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)

2 个答案:

答案 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永远不会知道并且永远无法理解是否满足第一个条件,至少没有达到数据库。