我正在使用django-mptt(5.5版)django-mptt.github.io/django-mptt/
我有一个树结构为:
+Object Oriented
|----Java
+Procedural
|----Python
|----PHP
|----B
|----C
Run Code Online (Sandbox Code Playgroud)
现在,我想通过将父节点Python和PHP节点更改为来重构树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,但它似乎与我的大脑完全不兼容 - 我最终在非显而易见的地方出现了非明显的错误,主要是在树中移动物体时:我最终处于不一致的状态,其中一个节点及其父节点将不同意他们的关系.
我的需求很简单:
我的树会很小(超过20个级别的最多10k节点,通常要小得多,比如10个节点,有1或2个级别).
我不得不认为必须有一种更简单的方法来在python/django中做树.是否有其他方法可以更好地保持一致性?
嘿,我刚刚安装了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-MPTT 来显示一个简单的 2 级层次结构(root => child(ren))。我正在寻找一种方法来构建我的查询集,以便节点返回时首先返回具有最多子节点的根节点,最后返回具有最少子节点(如果有)的节点。
我正在尝试使用 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的项目,但是当我使用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) 我计划在 MySQL 中存储一些类似树的数据。
主题可以有子主题,而主题又可以有更多子主题。
即使最大深度约为 3 - 4,修改后的预序树遍历 (MPTT) 是否会过度杀伤?
我有两个模型Project和Group. 我的小组属于一个特定的项目。我的小组有字段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 管理页面运行良好。
我不知道如何创建用于发布新评论和回复的表单。
这是我到目前为止所拥有的:
模型.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) 我的产品和类别之间存在多对多关系。我正在使用 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-mptt ×10
django ×6
python ×3
mptt ×2
tree ×2
django-admin ×1
hierarchy ×1
python-2.7 ×1
sql ×1