2010-06-03 1 views
0

Я нахожу это немного сложнее! Может быть, кто-то может помочь мне в этомСоответствие 3 из 5 полей - Django

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

class Unicorn(models.Model): 

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

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


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

ответ

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)   

не проверял, хотя

+0

'itertools.combinations()' –

+0

Моя база данных только что стерлась! Шутки, протестировали его! Огромное спасибо за это! – RadiantHex

+0

спасибо. было лениво искать его :) – Guard

2

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

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

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

+0

Спасибо за это! У меня есть небольшая проблема, хотя, потому что меня просят использовать программное обеспечение базы данных довольно часто. Я пытаюсь найти способ абстрагировать его, используя ORM Django. Отличный ответ, хотя спасибо! – RadiantHex

+0

'HAVING' переносится между базами данных. Это ORM Django, который не поддерживает его. –

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

+0

На это отвечает два вопроса в одном! Благодаря! = D – RadiantHex

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: 
     ... 
Смежные вопросы