- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为我的评论应用程序使用一个 django-mptt 包,我有以下模型:
class Comment(MPTTModel):
content = models.TextField(verbose_name='Treść')
author = models.ForeignKey(AUTH_USER_MODEL, verbose_name='Autor', blank=False, null=True)
is_deleted = models.BooleanField(verbose_name='Komentarz usunięty', default=False,
help_text='Zaznacz, aby usunąć komentarz')
ip = models.GenericIPAddressField(default=0, verbose_name='Adres IP')
content_type = models.ForeignKey(ContentType, verbose_name='Typ obiektu')
object_id = models.PositiveIntegerField(verbose_name='ID obiektu')
content_object = GenericForeignKey('content_type', 'object_id')
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
hotness = models.FloatField(default=0)
created_at = models.DateTimeField(auto_now_add=False, verbose_name='Data dodania')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Aktualizacja')
class MPTTMeta:
order_insertion_by = ('-hotness', '-created_at')
class Meta:
verbose_name = 'Komentarz'
verbose_name_plural = 'Komentarze'
def __unicode__(self):
if len(self.content) > 50:
return self.content[:50] + '...'
else:
return self.content
我想让用户可以按热度或创建日期对评论树进行排序。是否可以从 View 中编辑 order_insertion_by
字段以生成 2 种类型的排序(按日期、按热度)?感谢您的帮助。
最佳答案
Modified Preorder Tree Traversal
(MPTT) 是一种使用左(lft
in mptt)和右(rgt)查询检索树结构的方法
) 编号如图所示 http://sitepointstatic.com/graphics/sitepoint_numbering.gif .
定义多个 order_insertion_by 将执行以下操作(根据 mptts 评论):
"""
Creates a filter which matches suitable right siblings for ``node``,
where insertion should maintain ordering according to the list of
fields in ``order_insertion_by``.
For example, given an ``order_insertion_by`` of
``['field1', 'field2', 'field3']``, the resulting filter should
correspond to the following SQL::
field1 > %s
OR (field1 = %s AND field2 > %s)
OR (field1 = %s AND field2 = %s AND field3 > %s)
"""
如果我没有理解错的话,order_insertion_by
指定兄弟元素的顺序,表示父元素的子元素(而非后代)。如果你想要两个不同的顺序,lft
和 rgt
也必须改变,因此它是第二棵树。这不包括在 mptt 中。
你还是可以的
Comment.objects.all().order_by('-hotness')
但是你会失去树结构。通常不可能维护树结构并通过其他方式对整棵树进行排序,例如热度。假设您有以下内容:
Comment1 (hotness 0)
Comment2 (hotness 2, child of Comment1)
Comment3 (hotness 1)
这会导致
Comment2
Comment3
Comment1
它是有序的,但是 Comment2
没有附加到 Comment1
上。如果您想在兄弟级别的基础上使用 order_insertion_by
定义的其他内容进行排序,以获得以下内容:
Comment3
Comment1
Comment2
也许可以编写一个新的模板标记,如 {% recursetree objects -hotness %}
迭代并重新排序 children
元素并返回新树.它仍然是一个数据库查询 - 但我无法估计性能损失。
您必须按如下方式创建 mptt 并编辑 mptt_tags.py
:
class RecurseTreeNode(template.Node):
def __init__(self, template_nodes, queryset_var, order_var=None):
self.template_nodes = template_nodes
self.queryset_var = queryset_var
self.order_var = order_var
def _render_node(self, context, node):
bits = []
context.push()
children = node.get_children()
if children and self.order_var is not None:
children = children.order_by(self.order_var)
for child in children:
bits.append(self._render_node(context, child))
context['node'] = node
context['children'] = mark_safe(''.join(bits))
rendered = self.template_nodes.render(context)
context.pop()
return rendered
def render(self, context):
queryset = self.queryset_var.resolve(context)
roots = cache_tree_children(queryset)
bits = [self._render_node(context, node) for node in roots]
return ''.join(bits)
@register.tag
def recursetree(parser, token):
bits = token.contents.split()
if len(bits) < 2:
raise template.TemplateSyntaxError(_('%s tag requires a queryset') % bits[0])
queryset_var = template.Variable(bits[1])
if len(bits) == 3:
order_var = bits[2]
else:
order_var = None
template_nodes = parser.parse(('endrecursetree',))
parser.delete_first_token()
return RecurseTreeNode(template_nodes, queryset_var, order_var)
关于python - django-mptt 中的动态顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341468/
我已经成功完成了 django-mptt 教程。我无法弄清楚如何做的是创建一个 child 的 child 。 child 的 child ,我的意思是更深的第三级。看下面的例子,我想创建 1.3.1
我想要一棵树来模仿带有文件夹和文件的文件系统。文件夹和文件将由具有不同字段属性的不同模型定义。 楷模: from mptt.models import MPTTModel, TreeForeignKe
在网上商店中,我使用 django-mptt 来处理多个级别的产品类别。我也有各自属于一个类别的产品。 现在我想像这样可视化类别树: all(18) - edible (10) -- food (4)
我正在尝试使用django-mptt运气微乎其微。这是来自 svn 的最新 Python2.5、windows、sqlite3、Django 1.2pre、django-mptt。 代码: 型号: c
我在我的 Django 应用程序中使用 django-mptt 作为文章模型。如果我想获取所有设置为例如隐藏的文章,我可以这样做 Article.objects.filter(hidden=False
我只是使用改进的预序树遍历 (MPTT) 构建一个表来存储分层数据——你知道的:每个节点存储 left 和 right ID 以查找其后代。我使用的是 CakePHP 建议的模型,它与标准方式不同,每
题 给定下面的模型,我想获得所有页面的查询集,用与页面关联的线程中的评论总数进行注释,包括与页面关联的评论线程树中的所有评论。 我正在使用 django-mptt存储评论树。 我可以使用 commen
我尝试了一段时间在我的项目中设置 django-mptt。我从 tutorial 中取样并相应地更改了模型,如下所示: class Genre(MPTTModel): pk = models.Auto
几个星期以来,我一直在用头撞在 table 上解决这个问题,所以我认为可能是时候寻求一些帮助了。 我正在尝试实现一个数据库结构,它具有组件零件的分层数据。我的主要问题在于尝试将一个“子程序集”分配给另
我正在尝试将 mptt 库用于简单的嵌套评论系统。 我的模特 class Comment(MPTTModel): event = models.ForeignKey(Event) au
我是 Django 和 MPTT 的新手,很难弄清楚如何获取所有叶节点并将它们直接发送到 Form 类。 例如,我创建了 MPTT 类别模型,并具有如下层次结构: 类别1 类别2 类别3 类别4 类别
我在尝试让导入导出适用于 mptt 模型时遇到问题。这是我的代码: models.py from django.db import models from mptt.models import MPT
情况是这样的。我正在 Django 中利用 MPTT 模型来创建音乐流派的层次结构(摇滚、硬摇滚等)。我将此层次结构的节点之一分配给相册。假设我创建了一个具有硬摇滚风格的专辑对象。我如何查询我的专辑中
我正在尝试弄清楚如何编写返回多维数组的函数。我知道如何使用“category_parent”值编写函数。但我只是想编写一个函数,仅使用左右键即可创建多维数组。 array(71) { [0]=>
.move_to() 方法对我不起作用。我看过其他人建议保存实例以及重新加载节点实例的帖子。但这些解决方案都不适用于此测试用例。我也尝试过 ._tree_manager.rebuild(),它也不起作
情况是这样的。我正在 Django 中利用 MPTT 模型来创建音乐流派的层次结构(摇滚、硬摇滚等)。我将此层次结构的节点之一分配给相册。假设我创建了一个具有硬摇滚风格的专辑对象。我如何查询我的专辑中
我在模型中使用 mptt 来管理标记系统(每个标记都有一个可选的 TreeForeignKey 到“父”标记) 每当我需要保存标签模型时,以下查询运行得异常缓慢(超过 45 秒) UPDATE "t
因此,我使用 MySQL 并将基于嵌套集/修改后的预序树遍历模型的类别结构存储在表名“nested_category”中,该表具有以下字段:category_id,name,lft,rgt,publi
我有一个线程评论系统,在 99.9% 的时间里都可以正常工作,但偶尔树会崩溃,左/右值会重复。 我发现当两个帖子同时发生时(彼此相隔不到一秒)会发生这种情况,并且大概发生的情况是第二个帖子在第一个之前
我在我的 Django 项目中使用 MPTT 树结构来组织评论。我只有 2 个级别:评论和评论的评论除了排序之外,一切都完美无缺。 我想按创建日期上升(“-creation_date”)对所有没有父项
我是一名优秀的程序员,十分优秀!