我可能有一个经典问题,但我没有找到任何允许我这样做的片段。
我想用它的全名对这个模型进行排序。
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)
我尝试按“父”排序,得到无限循环错误。 “parent__id”并不合适。
我无法理解如何使用 annotate()来连接字符串字段。
我添加了一个带有 sorted()的自定义管理器,但它返回一个列表对象并阻止我的 forms.ModelChoiceField 工作。
< / LI> 醇>这是排序
def all(self):
return sorted(super(ProductTypeManager, self), key=lambda o: o.fullname)
djangonic丛林还有什么? 谢谢你的帮助。
答案 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')
为什么无限循环会出错?您的示例数据是否引用自身?