web-dev-qa-db-ja.com

Django関連するテーブルフィールドを使用してデフォルトの並べ替え順序をモデル化する

モデルのデフォルトの並べ替え順序を(整数キーではなく)関連するモデルのフィールドに設定することはできますか?つまり、両方のモデルのフィールドを持つSQLのorder by句を生成するものですか?もしそうなら、どのように? query_byを介してこれを行うことはできますが、デフォルトで設定する方法がわかりません。ありがとう。

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    class Meta:
        ordering = ('bar_date', 'related.name', )
23
Chris

Django 1.2.7を使用し、ForeignKey.Attributeを接続する代わりに、「__」を使用する必要があるため、このコードは機能します。

class Meta:
    ordering = ('bar_date', 'related__name', )
28
L.A.

order-with-respect-to を見てください。

4
Stuart Childs

Order_with_respect_to(1つのフィールドのみをサポート)の代わりに、カスタムマネージャーを使用して順序を指定できます。これにより、Fooの複数のフィールドで注文しても、通常のBar.objectsマネージャーを使用できます。 Meta.orderingまたはカスタムマネージャーの順序が最初に適用されるかどうかを確認するためにテストする必要があります。

class FooSortedManager(models.Manager):
    def get_query_set(self):
        return super(FooSortedManager, self).get_query_set().order_by('foo__name')

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    foo_sorted = FooSortedManager()

    class Meta:
        ordering = ('bar_date',)
3
mattkemp

Djangoの最新バージョンでは、次のようになります。

class Meta:
        ordering = ['Word']
0
Atma

うーん...古いDjangoアプリケーション、qs-rfの前に書かれた、おそらく「ドット」表記が使用されていたアプリケーションをアップファクタリングしながら、同様のことを解決しています??? ...私は数時間かかりました「何か」を開示しても、まだわかりませんが、ドットを「__」(二重下線)に置き換えてみてください。これは役立つ可能性があります。実際、現在、私はまだ希望があります:-)))

@stuart:「order_with_respect_to」について、子テーブルに自動的に追加された物理モデルフィールドについて何かを読みました...ここにあるものがどのようになっているのか完全には理解していません... IMHOのドキュメントは、構文の順序付けについて非常に悪いです。

コメントなし:-) http://code.djangoproject.com/ticket/8975

とにかく、私はDjangoが好きです、それでも... :-))

0
falken007