Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2010 10:53:29

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Нестандартный запрос

Всем привет! Пошарился по форуму и не нашел ответа. Есть следующая модель:

from django.db import models

condition_choices = (
(0, u'Совпадает'),
(1, u'Начинается'),
(2, u'Содержит'),
(3, u'Оканчивается'),
)

class ADPassAssociate (models.Model):
association = models.CharField (max_length = 20, unique=True, verbose_name=u'Имя компа')
condition = models.IntegerField (choices = condition_choices, verbose_name = u'Условие')
Суть в следующем: в таблицу вносятся данные - строка для соответсивия и условие. Потому нужно выбрать строки, в которых условия удовлетворяют поступившим данным. Т.е. Если есть такие поля (id, association, condition):
0, name1, 0
1, super_name, 1
2, third_name, 2
и поступает строка super_name123 то результатом будет поле с id 1, а если поступает строка 777third_name333 то результатом будет поле с id 2. Не подскажете, можно ли это реализовать запросом с помощью ORM? Если нет, то как лучше: выбирать все поля из БД и уже Питоном искать нужное или накатать на SQL функцию, которая сама будет искать нужное и возвращать уже результат, а Django будет вызывать эту функцию? С одной стороны, получаю независимость от БД, с другой - скорость, при большом кол-ве условий в таблице.



Офлайн

#2 Апрель 27, 2010 23:33:51

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Нестандартный запрос

Если я правильно понял что нужно сделать

def func(str):
startswith_conditions = ADPassAssociate.objects.filter(condition=1)
for c in startswith_conditions:
if str.startswith(c.association):
return c.id
endswith_conditions = ADPassAssociate.objects.filter(condition=3)
for c in endswith_conditions:
if str.endswith(c.association):
return c.id
contains_conditions = ADPassAssociate.objects.filter(condition=2)
for c in contains_conditions:
if str.find(c.association) != -1:
return c.id
return -1



Офлайн

#3 Апрель 28, 2010 09:54:25

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Нестандартный запрос

svas
Если я правильно понял что нужно сделать
def func(str):
startswith_conditions = ADPassAssociate.objects.filter(condition=1)
for c in startswith_conditions:
if str.startswith(c.association):
return c.id
endswith_conditions = ADPassAssociate.objects.filter(condition=3)
for c in endswith_conditions:
if str.endswith(c.association):
return c.id
contains_conditions = ADPassAssociate.objects.filter(condition=2)
for c in contains_conditions:
if str.find(c.association) != -1:
return c.id
return -1
Если методами самого Python (а не Django ORM), то да - так и буду. Пока проверю так, если тормозить не будет, то и функцию на SQL писать не буду. Спасибо за ответ.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version