标签: django-mptt

如何在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
查看次数

在Python/Django中存储分层(父/子)数据:MPTT替代?

我正在寻找一种在Django中存储和使用分层(父/子)数据的好方法.我一直在使用django-mptt,但它似乎与我的大脑完全不兼容 - 我最终在非显而易见的地方出现了非明显的错误,主要是在树中移动物体时:我最终处于不一致的状态,其中一个节点及其父节点将不同意他们的关系.

我的需求很简单:

  • 给定一个节点:
    • 找到它的根
    • 找到它的祖先
    • 找到它的后代
  • 用树:
    • 轻松移动节点(即更改父节点)

我的树会很小(超过20个级别的最多10k节点,通常要小得多,比如10个节点,有1或2个级别).

我不得不认为必须有一种更简单的方法来在python/django中做树.是否有其他方法可以更好地保持一致性?

python django tree mptt django-mptt

5
推荐指数
1
解决办法
2777
查看次数

Django-MPTT,怎么样

嘿,我刚刚安装了django-mptt lib,但我不知道如何让它工作:(

我已经添加了

from mptt.models import MPTTModel

class Category(MPTTModel):
    slug = models.SlugField(max_length=200, unique=True)
    name = models.CharField(max_length=100)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='child')
Run Code Online (Sandbox Code Playgroud)

它工作正常

-

但是,当我去我的网站的Django管理页面时,我收到一个错误:

TemplateDoesNotExist位于/​​ admin/search/category /

管理员/ mptt_change_list.html

django-admin django-mptt

5
推荐指数
2
解决办法
4231
查看次数

Django-MPTT - 按直接后代的数量对根节点进行排序

我正在使用 Django-MPTT 来显示一个简单的 2 级层次结构(root => child(ren))。我正在寻找一种方法来构建我的查询集,以便节点返回时首先返回具有最多子节点的根节点,最后返回具有最少子节点(如果有)的节点。

django-queryset django-mptt

5
推荐指数
1
解决办法
1602
查看次数

order_insertion_by 降序排序?

我正在尝试使用 mptt 库来实现简单的嵌套评论系统。

我的模特

class Comment(MPTTModel):
    event = models.ForeignKey(Event)
    author = models.CharField(max_length=60)
    comment = models.TextField()
    added  = models.DateTimeField(default=timezone.now())
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
    class MPTTMeta:order_insertion_by = ['added']
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用 {% recursetree Nodes %} 模板标签,它会根据“添加”按升序时间显示节点。我想按时间降序显示根音,首先显示最新的评论。我尝试对节点进行排序,使其按降序排列,但 recursetree 不遵循该顺序。有没有办法指定降序排列?我尝试了['-added'],但它不起作用。

django-mptt

5
推荐指数
1
解决办法
996
查看次数

从`django-mptt`使用`get_ancestors`函数时出现错误的结果

我正在开发一个使用django-mptt的项目,但是当我使用get_ancestors函数时,我得到了奇怪的结果.这是一个例子.
我有一个创建了一个简单的模型,继承自MPTTModel:

class Classifier(MPTTModel):
    title = models.CharField(max_length=255)
    parent = TreeForeignKey('self', null = True, blank = True, 
                            related_name = 'children')

    def __unicode__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

以下是适用于此模型的功能:

def test_mptt(self):
    # Erase all data from table
    Classifier.objects.all().delete()

    # Create a tree root
    root, created = Classifier.objects.get_or_create(title=u'root', parent=None)

    # Create 'a' and 'b' nodes whose parent is 'root'
    a = Classifier(title = "a")
    a.insert_at(root, save = True)
    b = Classifier(title = "b")
    b.insert_at(root, save = True)

    # Create 'aa' and 'bb' nodes whose …
Run Code Online (Sandbox Code Playgroud)

python django tree hierarchy django-mptt

5
推荐指数
1
解决办法
1400
查看次数

即使深度约为 3 - 4,MPTT 对于维护树状数据库是否有点过大?

我计划在 MySQL 中存储一些类似树的数据。
主题可以有子主题,而主题又可以有更多子主题。
即使最大深度约为 3 - 4,修改后的预序树遍历 (MPTT) 是否会过度杀伤?

sql mptt django-mptt graph-databases

5
推荐指数
1
解决办法
391
查看次数

在 Django 中使用 limit_choices_to 中的字段值

我有两个模型ProjectGroup. 我的小组属于一个特定的项目。我的小组有字段project = ForeignKey(Project)parent = ForeignKey('self').

我可以limit_choices_to用来确保外键中的选项parent仅包含同一项目中的组吗?

我在想像

def limit_choices_to(self):
    return {'project': self.project}
Run Code Online (Sandbox Code Playgroud)

django django-models django-mptt

5
推荐指数
1
解决办法
2216
查看次数

如何使用 django-mptt 创建嵌套评论系统

我正在写一个简单的博客,我正在尝试为每个帖子实现一个嵌套的评论系统。

我创建了评论模型,它通过 Django 管理页面运行良好。

我不知道如何创建用于发布新评论和回复的表单。

这是我到目前为止所拥有的:

模型.py

(...)
class Post(models.Model):
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    title = models.CharField(max_length=250)
    slug = models.SlugField(unique=True, blank=True, max_length=250)
    created = models.DateTimeField(auto_now=False, auto_now_add=True)
    modified = models.DateTimeField(auto_now=True, auto_now_add=False)
    tags = TaggableManager(blank=True)
    image = models.ImageField(upload_to="images/%Y/%m/", blank=True, null=True)
    content = models.TextField()

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'slug': self.slug, })

    # create slug
    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(unidecode(self.title))
        super(Post, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.title)

class Comment(MPTTModel):
    post = models.ForeignKey("Post", on_delete=models.CASCADE, null=True, related_name='comments')
    parent = TreeForeignKey('self', null=True, …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-mptt

5
推荐指数
1
解决办法
3585
查看次数

Django:使用mptt-django以多对多关系将产品分配给类别

我的产品和类别之间存在多对多关系。我正在使用 mptt 来管理管理员上类别的显示(效果很好),因此我可以将产品分配到类别。

虽然类别运行良好,但我在产品方面遇到了问题。

在我的 models.py 中,我有(为了简洁而被截断):

from mptt.models import MPTTModel,TreeForeignKey,TreeManyToManyField

class ProductCategory(MPTTModel):
    parent = TreeForeignKey('self', null=True, blank=True)

class Product(models.Model)
    categories = TreeManyToManyField(ProductCategory)
Run Code Online (Sandbox Code Playgroud)

在我的 admin.py 中我有

from django.forms import CheckboxSelectMultiple
from .models import Product,ProductCategory
from django.db import models
from django.contrib import admin
from mptt.admin import MPTTModelAdmin
from mptt.models import TreeManyToManyField

class ProductAdmin(admin.ModelAdmin):

   formfield_overrides = {
      TreeManyToManyField:{'widget':CheckboxSelectMultiple},
   }
Run Code Online (Sandbox Code Playgroud)

这几乎完成了工作,但所有类别都显示有复选框,这不是我想要的,因为您不想将产品添加到具有子类别的类别中。

在此输入图像描述

我想要的是显示类别,以便您只能将产品添加到没有子类别的类别中,因此在本例中

Category 1
Category 2 sub sub 
Category 3 sub
Run Code Online (Sandbox Code Playgroud)

标签将是

Category 1
Category 2 > Catgory 2 sub > Category 2 …
Run Code Online (Sandbox Code Playgroud)

django django-mptt

5
推荐指数
1
解决办法
2413
查看次数