标签: django-mptt

如何从django-mptt创建一个json树?

我想使用JavaScript InfoVis Tooljit(http://thejit.org)在django中渲染一个mptt节点的树.如何在django中创建所需的json结构(请参阅http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html以获取示例)?

谢谢

django django-mptt

9
推荐指数
1
解决办法
5514
查看次数

Django-mptt命令

在我的项目中,我使用django-mptt进行分类.

我的模特:

class Category(models.model):
    name = models.CharField()
    parent = models.ForeignKey("self", blank=True, null=True,
                           related_name="sub_category")
    nav_order = models.IntegerField(null=False, blank=False, default=0)
    # unsure need nav_order column in DB

    class Meta:
        verbose_name_plural = 'Categories'
mptt.register(Category)
Run Code Online (Sandbox Code Playgroud)

我需要有能力获得当前类别的订单,如下所示:

Category                Navigation order(one column)

CatA                      0
|-subcat11                 0
  |-sub11a                    0
  |-sub11b                    1
  \-sub11c                    2
\-subcat12                 1
CatB                      1  
|-subcat21                 0
|-subcat22                 1
\-subcat23                 2
  \-sub23a                    0
CatC                      2
Run Code Online (Sandbox Code Playgroud)

如何在创建/移动元素上快速填充/重新计算订单列.或者按类别计算它Category.objects.get(name='sub11b').get_order()应该返回1.

python django django-mptt

8
推荐指数
1
解决办法
4278
查看次数

Django MPTT Postgres更新查询运行缓慢

我在模型中使用mpt来管理标记系统(每个标记都有一个可选的TreeForeignKey到'父'标记)

每当我需要保存标签模型时,以下查询运行异常缓慢(超过45秒)

 UPDATE "taxonomy_taxonomy" SET "tree_id" = ("taxonomy_taxonomy"."tree_id" + %s) WHERE "taxonomy_taxonomy"."tree_id" > %s 
Run Code Online (Sandbox Code Playgroud)

我通过自动标记系统发送文章内容,该系统可以生成超过20个标签.显然,那不会飞:)

我添加了db_index = False希望改变写入时间(读取似乎不是问题),但问题仍然存在.

这是有问题的模型:

class Taxonomy(MPTTModel):

parent = TreeForeignKey('self',blank=True,null=True,related_name='children',verbose_name='Parent', db_index=False)
parent_name = models.CharField(max_length=64, blank=True, null=True, editable=False)
name = models.CharField(verbose_name='Title', max_length=100, db_index=True)
slug = models.SlugField(verbose_name='Slug', blank=True)
primary = models.BooleanField(
    verbose_name='Is Primary',
    default=False,
    db_index=True,
)
type = models.CharField(max_length=30, db_index=True)
created_date = models.DateTimeField(auto_now_add=True, null=True)
updated_date = models.DateTimeField(auto_now=True, null=True)
publication_date = models.DateTimeField(null=True, blank=True)
scheduled_date = models.DateTimeField(null=True, blank=True)
workflowstate = models.CharField(max_length=30, default='draft')
created_by = models.ForeignKey(User, null=True)

paid_content = models.BooleanField(verbose_name='Is Behind …
Run Code Online (Sandbox Code Playgroud)

django postgresql django-models mptt django-mptt

8
推荐指数
1
解决办法
596
查看次数

Django-mptt完全越野车或我做错了吗?

我试图用很少的运气来使用django-mptt.这是与Python2.5,windows,sqlite3,Django 1.2pre,django-mptt最新的svn.

代码:

模型:

class Node(models.Model):
    name   = models.CharField(max_length=20, blank=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

    def __unicode__(self):
        return self.name

mptt.register(Node)
Run Code Online (Sandbox Code Playgroud)

建立:

nodes = []
for i in range(15):
    n = Node(name='node'+str(i))
    n.save()
    nodes.append(n)

nodes[0].move_to(None)
nodes[0].save()
for n in range(1,15):
    nodes[n].move_to(nodes[(n-1)/2],'last-child')
    nodes[n].save()
Run Code Online (Sandbox Code Playgroud)

这应该创建一个树,其中一个根和两个子节点挂在每个非叶节点之外.

现在好玩的开始了:

>>> nodes[0].children.all()
[<Node: node1>, <Node: node2>]
>>> nodes[0].get_descendants()
[]

>>> nodes[0].get_descendants(True)
[<Node: node0>, <Node: node2>]


>>> for n in nodes:
...     print n, n.get_ancestors()
...
node0 []
node1 [<Node: node0>]
node2 [<Node: node0>]
node3 …
Run Code Online (Sandbox Code Playgroud)

django mptt django-mptt

7
推荐指数
1
解决办法
2407
查看次数

在django-MPTT中重新排序子节点

我正在使用Ben Firshman的django-MPTT 分叉(Daniel Roseman建议).

我试图重新订购共享一个共同父节点的节点.我有一个主键列表,如下所示:

ids = [5, 9, 7, 3]
Run Code Online (Sandbox Code Playgroud)

所有这些节点都有一个父节点,比如主键1.

目前,这些节点是有序的[5, 3, 9, 7],我该如何重新排序[5, 9, 7, 3]呢?

我尝试过这样的事情:

last_m = MyModel.get(pk = ids.pop(0))
last_m.move_to(last_m.parent, position='first-child')

for id in ids:
  m = MyModel.get(pk = id)
  m.move_to(last_m, position='right')
Run Code Online (Sandbox Code Playgroud)

按照文档的move_to说法,我希望按照自己的意愿行事,但似乎没有任何改变.有时它似乎将第一个项目移动ids到其父项的第一个子项,有时它不会.

我说的对,我的文档的阅读move_to,调用move_to一个节点上n具有position=right和目标是一个兄弟n会移动n的目标后,立即?

我有可能搞砸了我的模型表,试图解决这个问题,所以上面的代码可能是正确的.这也有可能是一种更优雅的方式(也许是一种不涉及O(n)选择和O(n)更新的方式).

我误解了什么吗?

奖金问题:有没有办法强制django-MPTT重建lftrght给定模型的所有实例的值?

django django-mptt

7
推荐指数
1
解决办法
4229
查看次数

如何在Django REST中序列化层次关系

我有一个Django模型,使用django-mptt分层,看起来像:

class UOMCategory(MPTTModel, BaseModel):
    """
        This represents categories of different unit of measurements.
    """
    name = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='%(app_label)s_%(class)s_sub_uom_categories')
Run Code Online (Sandbox Code Playgroud)

现在的问题是我使用Django REST Framework创建了一个REST API; 如何确保父字段返回序列化数据?

这是Model Serializer:

class UOMCategorySerializer(BaseModelSerializer):
    """
    REST API Serializer for UOMCategory model
    """
    class Meta:
        model = UOMCategory
Run Code Online (Sandbox Code Playgroud)

python django serialization django-mptt django-rest-framework

7
推荐指数
1
解决办法
6272
查看次数

Django MPTT 使用 DRF 高效序列化关系数据

我有一个 MPTT 模型的类别模型。它是 m2m 到 Group,我需要用相关计数序列化树,想象我的类别树是这样的:

Root (related to 1 group)
 - Branch (related to 2 groups) 
    - Leaf (related to 3 groups)
...
Run Code Online (Sandbox Code Playgroud)

所以序列化的输出看起来像这样:

{ 
    id: 1, 
    name: 'root1', 
    full_name: 'root1',
    group_count: 6,
    children: [
    {
        id: 2,
        name: 'branch1',
        full_name: 'root1 - branch1',
        group_count: 5,
        children: [
        {
            id: 3,
            name: 'leaf1',
            full_name: 'root1 - branch1 - leaf1',
            group_count: 3,
            children: []
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的超级低效实现:

模型

class Category(MPTTModel):
    name = ...
    parent = ... (related_name='children')

    def get_full_name(self): …
Run Code Online (Sandbox Code Playgroud)

python django serialization django-mptt django-rest-framework

7
推荐指数
1
解决办法
4367
查看次数

Django-MPTT子页面的完整路径如何制作?

我开始使用Django-MPTT应用程序在我的Django网站页面上获得基于树的方法.

对于前者 我有子页面的页面:

发呆:

  • 声乐恍惚(子页面)
  • 硬恍惚(子页)

休息:

  • Atmo Breaks(子页面)
  • 渐进式中断(子页面)

如何从urls.py访问它们?什么模式会有所帮助?我是否需要在模型中存储Full_path,或者可以通过url模式完成?

django-urls django-mptt

6
推荐指数
2
解决办法
3196
查看次数

如何在django-mptt中更改节点的父级

我正在使用django-mptt(5.5版)django-mptt.github.io/django-mptt/

我有一个树结构为:

+Object Oriented
|----Java
+Procedural
|----Python
|----PHP
|----B
|----C
Run Code Online (Sandbox Code Playgroud)

现在,我想通过将父节点PythonPHP节点更改为来重构树Object Oriented,使其看起来像:

 +Object Oriented
|----Java
|----Python
|----PHP
+Procedural
|----B
|----C
Run Code Online (Sandbox Code Playgroud)

我已经尝试通过更改节点的父属性为

>>>oo=Nodes.objects.get(name='Object Oriented')
>>>py=Nodes.objects.get(name='Python')
>>>py.parent=oo
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我得到:

>>>py.parent==oo
True
>>>py.get_ancestors(ascending=False, include_self=False)
[<Nodes : 'Procedural'>]
Run Code Online (Sandbox Code Playgroud)

即使是内置方法,例如:

py.move_to(oo,'first-child')
Run Code Online (Sandbox Code Playgroud)

似乎不适合我。

如果需要更多说明,我的模型是:

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey

class Nodes(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

    def __unicode__(self):
        return self.name

    class MPTTMeta:
        order_insertion_by = ['name']
Run Code Online (Sandbox Code Playgroud)

请告诉我改变父母的方法。

django django-mptt python-2.7

6
推荐指数
0
解决办法
652
查看次数

Django中的非循环图

我想在Django中实现非循环图结构.例如,我在树结构中有一些类别:

Guitars
- Classical Guitars
- Western Guitars
- Guitars for Children

Ukuleles
- Soprano Ukulele
- Concert Ukulele
- Baryton Ukulele
- Ukuleles for Children
Run Code Online (Sandbox Code Playgroud)

现在,我想补充类别For Children并创建链接到现有的类别Guitars for ChildrenUkuleles for Children.但是我必须避免这个图中的周期.

实现它的最简单方法是什么?有可能用django-mptt吗?我需要它在动态和易于修改的管理.您可以将其映像为复杂eshop中的类别结构.

django graph django-mptt directed-acyclic-graphs

6
推荐指数
1
解决办法
817
查看次数