0

次の Django モデルがあります (ここでは大幅に簡略化されています)。

class Author:
    name = models.TextField()

class Editor:
    name = model.TextField()

class Publication:
    authors = models.ManyToManyField(Author)
    editors = models.ManyToManyField(Editor)

出版物には、著者または編集者のいずれかを含めることができますが、両方を含めることはできません。著者と編集者の統一による出版物のリストをアルファベット順に並べたいと思います。言い換えれば、著者と編集者の連結である仮想フィールドで注文したいと思います。creators

クエリ:

Publication.objects.all().order_by('authors__name', 'editors__name')

...著者がいない出版物をまとめて、そのグループ内で編集者に従って並べ替えますが、これは私が望んでいるものではありません。事実上、出版物に利用できる著者または編集者を使用し、それによってソートする必要があります。

この順序付けはデータベース レベルで行う必要があり、結果セットは膨大になる可能性があります。

4

3 に答える 3

0

値が定義されているフィールドで並べ替えるには、モデル レベルでカスタム Aggregate を使用するか、追加の句を使用して、QuerySet がアクセスできる場所に結合フィールドを作成する必要があります。

DB に完全に依存する必要がない場合は、extra を実装するのがおそらく最も簡単です。

qs = Publication.objects.extra({
   select={'contributor': "COALESCE(author.name,editor.name)"}
})
qs.extra(order_by = ['contributor'])

https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.extra

DB に依存しない必要がある場合は、concat の実装の 1 つを集計として使用することを検討する必要があります。例えば、

http://harkablog.com/inside-the-django-orm-aggregates.html

于 2014-01-21T15:01:32.453 に答える
0

1 つのアプローチは、次のメソッドを作成することcreatorsです。

class Publication:
    authors = models.ManyToManyField(Author)
    editors = models.ManyToManyField(Editor)

    def creators(self):
        return self.authors + self.creators

ただし、欠点は、並べ替えをデータベース レベルでは実行できず、Python レベルで実行できることです。

sorted(Publication.objects.all(), key=lambda k: " ".join(p.name for p in k))
于 2014-01-21T14:23:38.137 に答える
0

私はこれをそこに捨てることができますか?

から継承したい場合がAuthorsあります。両方のモデルには、姓名、住所などの情報が含まれているためです。EditorsContributors

于 2014-01-21T14:44:03.953 に答える