django - QuerySet рекурсивный порядок по методу - PullRequest
1 голос
/ 21 июля 2009

У меня может быть классическая проблема, но я не нашел ни одного фрагмента, позволяющего мне это сделать.

Я хочу отсортировать эту модель по полному имени.

class ProductType(models.Model):
    parent   = models.ForeignKey('self', related_name='child_set')
    name     = models.CharField(max_length=128)

    def get_fullname(self):
        if self.parent is None:
            return self.name
        return u'%s - %s' % (unicode(self.parent), self.name)
    fullname = property(get_fullname)
  1. Я попытался отсортировать по "родителю", получил ошибка бесконечного цикла . "parent__id" не отсортирован.

  2. Я не мог понять, как использовать annotate () для объединения строковых полей.

  3. Я добавил пользовательский менеджер с sorted () , но он возвращает объект списка и мешает моим forms.ModelChoiceField работать.

Вот такой вот

def all(self):
    return sorted(super(ProductTypeManager, self), key=lambda o: o.fullname)

Что еще есть в джангонских джунглях? Спасибо за вашу помощь.

Ответы [ 5 ]

2 голосов
/ 21 июля 2009

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

class ProductType(models.Model):
    parent   = models.ForeignKey('self', related_name='child_set')
    name     = models.CharField(max_length=128)
    full_name     = models.CharField(max_length=128*4)

    def save(self, *args, **kwargs):
        if not full_name:
            self.full_name = self.get_fullname()
        super(ProductType, self).save(*args, **kwargs)


    def get_fullname(self):
        if self.parent is None:
            return self.name
        return u'%s - %s' % (unicode(self.parent), self.name)

Затем сделайте нормальный заказ на full_name

1 голос
/ 21 июля 2009

Или, если вы пытаетесь создать древовидную структуру, взгляните на django-mptt . Это также позволяет заказывать заказ вручную.

0 голосов
/ 21 июля 2009

Я бы определенно изучил маршрут, который вы упомянули как 1) выше:

ProductType.objects.order_by('parent__name', 'name')

Почему происходит ошибка с бесконечным циклом? Ваш пример данных ссылается на себя?

0 голосов
/ 21 июля 2009

согласовано:

ProductType.objects.all (). Order_by ('parent__name', 'name')

http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by-fields

0 голосов
/ 21 июля 2009

Это может сработать:

ProductType.objects.alL().order_by('parent__name', 'name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...