遍历组,然后逐项循环

时间:2017-08-26 07:04:57

标签: python django

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")

在我的项目中,书签可以是框架,项目,工作表。 因此,我在Bookmark模型content_type_for_filter中组织了一个特殊字段。它可能包含" frame"或" item"或"表"。

书签必须分组显示:第一个书签为Frames,然后是Items,最后是Sheets:

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怎么办?

1 个答案:

答案 0 :(得分:0)

我的建议是,您进一步过滤书签查询集并将其放入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

更高级的选项可能是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)

<击>