2017-08-26 9 views
0

ジャンゴ1.11.4反復、項目の下

のPostgreSQL 9.6.3

によって、ループ項目がブックマークモデルです。

class Bookmark(CommonUrlMethodsMixin, 
       models.Model): 
    memo = models.CharField(max_length=200, 
          null=False, 
          blank=True, 
          default="") # Intentionally blank. 
               # For displaying in ModelForm. 

    content_type = models.ForeignKey(ContentType) 
    content_type_for_filter = models.CharField(max_length=6, 
          null=False, 
          blank=True, 
          default="") 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 
    user = models.ForeignKey(User, 
          on_delete=models.CASCADE) 

    def __str__(self): 
     return "{}: {} {}".format(self.content_object._meta.verbose_name.title(), self.content_object, self.memo) 

    class Meta: 
     verbose_name = _("bookmark") 

私のプロジェクトでは、ブックマークはフレーム、アイテム、シートにすることができます。 ブックマークモデルcontent_type_for_filterに特別なフィールドを編成しました。 「フレーム」または「項目」または「シート」のいずれかを含むことがあります。

ブックマークはグループに示されなければならない:フレームのために、その後、項目の最後にシートのための最初のブックマーク:

Frames 
    bookmark 1 
    bookmark 2 
    bookmark 3 
Sheets 
    bookmark 4 
    bookmark 5 
Items 
    bookmark 6 
    bookmark 7 
    bookmark 8 

をそれから私は、ブックマークを表示したい個人の領域に。ビューでは、今私が持っている:私のコードは受け入れられないと思われ

def get_context_data(self, **kwargs): 
    bookmarks = user.bookmark_set.all() 
    # context['bookmarks'] = bookmarks 

。見てください:どうやらPythonでブックマークを処理する必要があります。名前付きタプルなどを使用します。リストの少なくとも3つのリスト。

私は、データベースからの私の選択は最適ではないと考えています。おそらく、 "content_type_for_filter"でグループ化することができます。 その後、グループをループします。グループの内容をループします。しかし、私はどのように知りません。

どうすればいいですか? ORMで可能ですか?そうでない場合、ORMなしでそれを行う方法は?

+0

を次のようにあなたはそれを定義することが私のコードは受け入れられないようです。 < - まあ、それじゃないの? (何が効いていないのですか?) – timgeb

答えて

0

私の提案は、あなたがさらにあなたのブックマーククエリセットをフィルタリングし、より良いあなたのニーズに合わせ辞書または別のクラスの中に置くことである:

bookmarks = user.bookmark_set.all() 
from collections import OrderedDict as odict 
groups = odict() 
for group in ['Frames', 'Sheets', 'Itens']: 
    groups[group] = bookmarks.filter(content_type_for_filter=group) 
context['groups'] = groups 

より高度なオプションがaggregatingあなたのクエリセットである可能性があります。 AFAIKは、値や注釈のみをグループ化しますが、間違っている可能性があります。

def get_context_data(self, **kwargs): 
    context = super(<YOUR VIEW NAME>, self).get_context_data(**kwargs) 

その後、あなたがユーザーに定義されていなかったようだ:すべての

まず、あなたはコンテキストを定義する必要があります。

# current user 
context['bookmarks'] = self.request.user.bookmark_set.all() 

# using an user specified in kwargs 
user = get_object_or_404(User, kwargs.get('user_pk')) 
# or, if your view is a DetailView of User 
user = self.get_object() 
# then, finally 
context['bookmarks'] = Bookmarks.objects.filter(user=user) 

+0

あなたの言ったことは、最初の投稿ではすでに行われています。私は文脈を定義していないのですか?ユーザーを定義していませんか?ユーザーがいないと、プログラムは壊れてしまいます:ユーザー変数が定義される前に使用されていることを伝えます。最後に、あなたの答えがどのようにグループにブックマークを表示するのに役立つのですか? – Michael

+0

すみません。私は文脈が定義されたと思った。だから、それは省略されただけですよね?そして、私がこれらの提案を書くのを終えたとき、私は実際に答えを提供することを完全に忘れてしまった。 –

関連する問題