Модель фильтра Django, использующая только Unicode объекта - PullRequest
1 голос
/ 31 августа 2011

У меня есть модель 'Objective', где обычным способом обращения к объектам является метод Unicode.

models.py:

class Objective(models.Model):
    level = models.IntegerField()
    strand = models.ForeignKey(Strand)
    order = models.IntegerField()
    description = models.TextField()
    def __unicode__(self):
        return u'%s%s%s' % (self.level, self.strand.code, self.order)

    class Meta:
        unique_together = ("strand", "level", "order")
        ordering = ['level', 'strand', 'order']

Пример объекта в этой модели будет называться, например, 6ssm4, для четвертой записи в цепочке ssm на уровне 6. Я хочу выполнить поиск (скажем, из разбора URL), ссылаясь на эту строку юникода.

urls.py:

(r'^(?P<objective>[^/]+)/$', 'display_objective'),

Я попробовал все следующие варианты в виде строк в views.py (не все сразу!):

def display_objective(request, objective):
    theobjective = Objective.objects.get(unicode() = objective)
    theobjective = Objective.objects.get(self.unicode = objective)
    theobjective = Objective.objects.get(__unicode__ = objective)
    theobjective = Objective.objects.get(objective__iexact = objective)
    theobjective = Objective.objects.get(objective)
    theobjective = Objective.objects.get(unicode() = objective)

Но если перейти к http://localhost:8000/6ssm4/, я получу страницу с ошибками типа «Ключевое слово не может быть выражением» или «Не удается разрешить ключевое слово« self »в поле». Варианты выбора: оценка, описание, идентификатор , уровень, порядок, прядь ".

Это законный способ поиска объектов или я должен анализировать ключевое слово? Если это допустимо, какой правильный синтаксис?

1 Ответ

1 голос
/ 31 августа 2011

ORM преобразует значения фильтра l (значения слева от знака равенства) в термины поиска SQL, поэтому он имеет ограниченный синтаксис.Вы не можете сделать функцию Python термином поиска SQL;база данных ничего не знает о Python.

Один из правильных способов сделать это - создать новое поле в таблице, назвать его index или lookup, а затем сделать это:

def save(self, *args, **kwargs):
    self.lookup = self.__unicode__()
    super(Objective, self).save(*args, **kwargs)

Поле поиска становится предварительно обработанным членом вашей таблицы; каждый каждый раз, когда вы сохраняете Objective, его готовая к поиску версия сохраняется в таблице.Затем вы можете:

theobjective = Objective.objects.get(lookup = objective)

Ваша альтернатива - разбить цель на составные части и отфильтровать по уровню, прядям и порядку, но это работает, только если они достаточно регулярны для регулярного выражения.1013 *

Это классический компромисс между временем программирования и быстротой реагирования и памятью (выберите два).В этом случае я обратился с призывом, чтобы время программиста и скорость реагирования были важнее, чем вопросы хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...