匹配3个5场 - Django

时间:2010-06-03 08:54:35

标签: python sql-server django django-models django-queryset

我发现这有点棘手!也许有人可以帮我这个

我有以下型号:

class Unicorn(models.Model):

  horn_length = models.IntegerField()
  skin_color = models.CharField()
  average_speed = models.IntegerField()
  magical = models.BooleanField()
  affinity = models.CharField()

我想搜索所有至少有3个共同字段的类似独角兽。


太棘手了吗?还是可行的?

4 个答案:

答案 0 :(得分:2)

必须在HAVING子句中完成:

SELECT ... HAVING (IF(a.horn_length=b.horn_length, 1, 0) + ...) >= 3

无法在Django ORM中表达HAVING,因此您需要降至raw SQL才能执行此操作。

答案 1 :(得分:2)

您应该使用Q对象。粗略的例子是:

from django.db.models import Q
from itertools import combinations
# this -- the unicorn to be matched with
attr = ['horn_length', 'skin_color', 'average_speed', 'magical', 'affinity']
q = None
for c in combinations(attrs, 3):
    q_ = Q(**{c[0]: getattr(this, c[0])}) & Q(**{c[1]: getattr(this, c[1])}) & Q(**{c[2]: getattr(this, c[2])})
    if q is None:
        q = q_
    else:
        q = q | q_
Unicorn.objects.get(q)           

未经测试,但

答案 2 :(得分:1)

如果我理解的话,这应该涵盖你的问题:

from django.db import models

Unicorn.objects.filter(models.Q(skin_color = 'white') | models.Q(magical = True))

这将过滤所有肤色为白色或有一些神奇东西的独角兽。有关Q对象的更多信息http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

答案 3 :(得分:1)

我从未使用过Django,而且我是Python的新手,但也许你可以这样做:

制作一个比较Unicorn类的两个实例的方法。

def similarity(self, another)
    sim = 0
    if (self.horn_length==another.horn_length):
        sim+=1
    if (self.skin_color==another.skin_color):
        sim+=1
    if (self.average_speed==another.average_speed):
        sim+=1
    if (self.magical==another.magical):
        sim+=1
    if (self.affinity==another.affinity):
        sim+=1
    return sim

然后你可以测试类似的东西:

myUnicorn
for x in unicornsList:
    if myUnicorn.similarity(x) >=3:
        ...