簡體   English   中英

遍歷組,然后逐項循環

[英]Iterate through groups, then loop item by item

Django 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中處理書簽。 使用命名的元組之類的東西。 或至少三個列表列表。

我想我從數據庫中選擇的不是最佳的。 假設可以按“ content_type_for_filter”分組。 然后循環瀏覽組。 然后循環瀏覽組的內容。 但是我不知道如何。

您能幫我理解該怎么做嗎? ORM有可能嗎? 如果沒有,那么在沒有ORM的情況下該怎么做?

我的建議是,您進一步過濾書簽queryset並將其放在dict或另一個更適合您需要的類中:

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

一個更高級的選項可能是聚合您的查詢 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)
 
  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM