2016-05-06 2 views
1

は、私はいくつかのモデルがあります:DjangoのORM、グループ/フォルダの最新アイテム/メッセージ

class Folder(models.Model): 
    title = models.CharField(max_length=255) 

class Message(models.Model): 
    title = models.CharField(max_length=255) 
    folder = models.ForeignKey(Folder) 

私が必要とする、ディスプレイのスクリーン(10など)の限界と、最新のメッセージを持つすべてのフォルダを、 like:

F1: F2: F3: 
m1  m3 m6 
m2  m4 .. 
m3  m5 .. 
       m10 

django-ormでこのクエリを作成するにはどうすればよいですか?感謝。

+0

「最新」をここでどのように定義しますか?あなたは 'DateTimeField'も持っていますか? – AKS

+0

簡略化のため、メッセージIDは –

+0

です。@DmitriyYusupovメッセージIDは日付ではありません。 – Gocht

答えて

2

あなたのFolderモデルでpropertyを追加することができます:の数を減らすためにを

{% for folder in folders %} 
    {{ folder.name }} 

    {% for msg in folder.latest_10_messages %} 
     {{ msg.title }} 
    {% endfor %} 
{% endfor %} 

UPDATE:その後、テンプレートにあなたがそれを使用することができ、

class Folder(models.Model): 
    title = models.CharField(max_length=255) 

    @property 
    def latest_10_messages(self): 
     # order by id decreasing and get top 10 
     return self.message_set.order_by('-id')[:10] 

そして、データベースへのクエリ:

あなたはクエリの数を減らしたい場合は、カスタムクエリセットでPrefetchオブジェクトを使用することができます。より良いパフォーマンスを得るために

{% for folder in folders %} 
    {{ folder.name }} 

    {% for msg in folder.message_titles|slice":10" %} 
     {{ msg }} 
    {% endfor %} 
{% endfor %} 
+1

ありがとうございます。良い。しかし、私は多くのフォルダを持っている場合、このソリューションはデータベースに多くのクエリを作成しました。しかし、私は1-2問合せでや​​りたい。 –

+0

フォルダごとに10個のメッセージが必要ですか?あなたもタイトルを表示したいですか? – AKS

+0

はい、Panelは次のようになります。https://hsto.org/files/4d9/7ed/f13/4d97edf13d1041b2821c9d2f502bab12.png –

1

prefetch_query = Prefetch('message_set__title', queryset=Message.objects.all().order_by('-id'), to_attr='message_titles') 
folders = Folder.objects.all().prefetch_related(prefetch_query) 

して、テンプレートのトップ10を取得するためにsliceを使用あなたはprefetch_relatedを使用して試みることができる:あなたのテンプレートで次に

# get the folders 
folders = Folder.objects.all().prefetch_related('message_set') 

# create a result list 
result = [] 

# populate result list 
result = [{'folder': f.title, 'messages': f.message_set.values('title').order_by('-id')[:10]} for f in folders] 

# every f.message_set... won't hit database, because of prefetch_related 

<ul> 
    {% for res in result %} 
    <li> 
     {% for message in res.messages %} 
     {{ message.title }} 
     {% endfor %} 
    </li> 
    {% endfor %} 
</ul> 

テンプレートでregroupを見てみることもできます。

免責事項:このコードは、テンプレートではなく類似のモデル構造でテストされています。多少変更する必要があるかもしれません。あなたのニーズに合わせて

+0

ありがとうございました!!!!! –

+0

@Gochtあなたはメッセージを注文していません。 OPは最新のものがほしい10. – AKS

+0

@AKSあなたが正しいです、私は注文とフィルタを追加しました。私が言ったように、少しの変更が必要になります。 – Gocht

関連する問題