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怎么办?答案 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)
击> <击> 撞击>