Соответствие 3 из 5 полей - Джанго - PullRequest
0 голосов
/ 03 июня 2010

Я нахожу это немного хитрым! Может быть, кто-то может помочь мне в этом

У меня есть следующая модель:

class Unicorn(models.Model):

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

Я бы хотел найти всех похожих единорогов, имеющих как минимум 3 общих поля.


Это слишком сложно? Или это выполнимо?

Ответы [ 4 ]

2 голосов
/ 03 июня 2010

Вы должны использовать 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 голосов
/ 03 июня 2010

Это должно быть сделано в предложении HAVING:

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

Нет способа выразить HAVING в ORM Django, поэтому вам нужно перейти к raw SQL , чтобы выполнить его.

1 голос
/ 03 июня 2010

Я никогда не использовал 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:
        ...
1 голос
/ 03 июня 2010

Это должно охватить ваш вопрос, если я правильно понял:

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

...