2009-07-21 6 views
1

古典的な問題があるかもしれませんが、スニペットが見つかりませんでした。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. 私はソート()でカスタムマネージャを追加しましたが、それはリストオブジェクトを返し、動作するように私のforms.ModelChoiceFieldを防ぐことができます。

はここでソート

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

djangonicジャングルの中で他に何があるのか​​? ご協力いただきありがとうございます。

答えて

0

これはうまくいくかもしれない:私はおそらくその上denomalisedフィールドと順序を作成します

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

これは、order_by( 'parent__id')のように、奇妙な動作をします。 – leplatrem

+0

「奇妙な動作」は、正確にはどういう意味ですか?それは間違っている特定のものであなたの質問を更新できますか? –

+0

私はそれがうまくいきません:http://pastebin.com/m3af438ac それは矛盾していることが知られています:http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

2

。あなたの設定に応じて、.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

0

により正常な秩序を行うには、合意された:

ProductType.objects.all()ORDER_BY( 'parent__name'、 '名前')

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

+0

"合意この答えの意味ですか?あなたが同意していることが明らかになるように修正できますか? –

+0

S.Lott、 "could"は時制を過ぎています。あなたはあなたのコメントを修正してくださいできますか? – slypete

0

私はあなたが上記1)と述べたルートを確かに探っています:

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

無限ループでエラーが発生するのはなぜですか?あなたのサンプルデータはそれ自体を参照していますか?

+0

これはDjango例外です: http://code.djangoproject.com/browser/django/trunk/django/db/models/sql/query.py?rev = 11274#L1012 ここで簡単に説明します: http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

1

または、実行しようとしているのがツリー構造を生成する場合は、django-mpttをご覧ください。また、手動で設定した順序での順序付けも可能です。

関連する問題