django - 按方法的QuerySet递归顺序

时间:2009-07-21 09:55:50

标签: python django

我可能有一个经典问题,但我没有找到任何允许我这样做的片段。

我想用它的全名对这个模型进行排序。

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 工作。

    < / LI>

    这是排序

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

    djangonic丛林还有什么? 谢谢你的帮助。

5 个答案:

答案 0 :(得分:2)

我可能会创建一个denomalised字段并对其进行排序。根据您的偏好,您可能会覆盖.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 :(得分:1)

或者,如果您要做的是生成树结构,请查看django-mptt。它还允许按手动设置订单进行订购。

答案 2 :(得分:0)

这可能有效:

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

答案 3 :(得分:0)

同意:

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

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

答案 4 :(得分:0)

我肯定会探索你上面提到的1)路线:

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

为什么无限循环会出错?您的示例数据是否引用自身?