2017-11-09 5 views
0

を回避:ジャンゴ1.11順序は、以下の簡略化され、私は(多くの関係1)親と子のモデルを持っているDjangoの1.11で

class Conversation(models.Model): 
    name = models.CharField(max_length=150) 

class Comment(models.Model): 
    comment_text = models.TextField() 
    submitted_date = models.DateTimeField() 
    conversation = models.ForeignKey(Conversation, on_delete=models.CASCADE) 

    class Meta: 
    ordering = ['-submitted_date'] 

会話は多くのコメントを持つことができます。今私がしたいのは、最も最近のコメントがある会話を注文することです。私は会話モデルにこれを追加しようとしました:

class Meta: 
    ordering = ['-comment__submitted_date'] 

そして作品のこの種が、それはクエリセットで重複を返す - この重複した動作がうまくジャンゴに文書化され、それがなぜ起こるか - https://docs.djangoproject.com/en/1.11/ref/models/querysets/#order-by - しかし、それはdoesnのそれを回避する方法については何も言わないでください。

私はこの制限を回避する方法を探しています。全体の目標は、会話を最新のコメント(submitted_date)でソートすることです。私は複数のバリエーションを試してみたが、それは一種全くないか、またはそれは(私には有用ではありません)重複を返します。 distinct()は動作しません。これもリンクに記述されています。

私は会話に「updated_atの」または類似のフィールドを追加し、コメントが作成されるたびに/更新することを更新し、それは私には本当にハックと汚れた感じ、そして可能ならば、私はむしろそれを避けるだろうことができます。

提案がありますか?

答えて

0

私は1つの方法は、各会話の最後のコメントの日付を検索し、次にソートこと

Conversation.objects.annotate(last_comment=Max('comment__submitted_date')) \ 
        .order_by("last_comment") 
+0

でこのクエリ自体が動作するように見えるんだと思います!どのような方法で私はこれを "順序付け"メタ属性に入れることができるので、デフォルトでこの方法で注文されますか?私は構文が何であるか分かりません。 –

関連する問題