标签: django-mptt

Django - 如何在保存新对象时获取self.id?

我的一个模型中有问题.我正在上传一个图片,我想存储id(数据库表中的pk),但我需要知道Django可以访问哪个点 self.id.

models.py

class BicycleAdItemKind(MPTTModel):
    def url(self, filename):
        pdb.set_trace()

        url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename)
        return url

    def item_kind_image(self):
        return '<img align="middle" src="/media/%s" height="60px" />' % self.image
    item_kind_image.allow_tags = True     

    # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista
    n_item_kind      = models.CharField(max_length=50) 
    parent           = TreeForeignKey('self', null=True,
                                      blank=True, related_name='children')
    description      = models.TextField(null=True, blank=True)
    image            = models.ImageField(upload_to=url, null=True, blank=True)
    date_inserted    = models.DateTimeField(auto_now_add=True)
    date_last_update = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.n_item_kind

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

问题出在url()方法上; 我只能self.id在更新对象时得到,我self.id …

django django-models django-mptt

30
推荐指数
3
解决办法
2万
查看次数

Django - 实现线程注释的正确方法

我正在使用Django开发一个博客网站.我的网站将允许用户评论我的任何博客文章,并相互回复,并将使用"线程评论"结构显示(我还没有启动用户功能,只是评论).我已经使用django-mptt(至少,现在)使用线程注释正常工作,但如果我正在采取的路线或步骤方向正确,我没有CLUE.几乎所有我经历过的教程只涉及到评论的表面,而不是在django中讨论线程评论.我想要一些经验丰富/专业的建议,告诉我可能做错了什么,以及我可以做得更好.我想要的最后一件事就是在经过数小时的工作后发现有一种更可接受的方式.

所以,这里列出了我需要明确的内容:

  1. Django的MPTT:

    • 我之所以选择这个,是因为我可以负担得起更慢 我的网站将有更多的读取而不是写入.这个选项对我的情况好吗?还有一个我不知道的更好的选择吗?
    • 如果我的网站最终有很多评论活动,我该怎么办?我该怎么做才能优化树木重组?或者我会更好地切换到邻接列表?
    • 我的MPTT评论模型有一个以自己为引用的ForeignKey(用于回复).这是正确的方法吗?或者我应该创建一个单独的回复模型?
    • 我在树中插入对另一个用户注释的回复的方式是使用mptt递归模板标记内的表单中的隐藏输入,并返回输入值(回复所针对的注释的id)并设置对该输入值的回复的父级.这是一种可接受的方法吗?
  2. 一个html页面上有多个表单

    • 我的博客文章html页面上有两个表单.一个评论博客文章,一个回复用户的评论.这被接受了吗?或者我应该为不同的表单创建不同的URL和查看功能?我是这样做的,因为我想要一个reddit风格的评论系统.我不希望它必须去另一个页面评论或回复.
    • 如果用户对我的博客帖子发表评论,则回复表单中的隐藏输入值不会返回任何内容,因此在尝试将其分配给views.py函数中的变量时会出现错误.我使用try/except块来修复它.这有更好的方法吗?

对不起,如果这些是菜鸟问题,我的帖子就这么久了.我只想用最好的方法为初学者使用现实的解决方案.任何反馈都会有帮助.谢谢!这是我的博客应用程序的代码.

models.py

    from django.db import models

    from mptt.models import MPTTModel, TreeForeignKey

    class Post(models.Model):
        """Blog post"""
        title = models.CharField(max_length=200)
        body = models.TextField()
       date_added = models.DateTimeField(auto_now_add=True)

        def __str__(self):
            return self.body[:50] + '...'

    class Comment(MPTTModel):
        """User comment"""
        post = models.ForeignKey(Post, related_name='comments',on_delete=models.CASCADE)
        parent = TreeForeignKey('self', null=True, blank=True, related_name='children',db_index=True, on_delete=models.CASCADE)

        user_comment = models.CharField(max_length=500, unique=True)
        date_added = models.DateTimeField(auto_now_add=True)
        # approved = models.BooleanField(default=False)

        class MPTTMeta:
            order_insertion_by = ['date_added']

        def __str__(self):
            return self.user_comment[:20]
Run Code Online (Sandbox Code Playgroud)

"已批准"已被注释掉,因为出于某种奇怪的原因我得到了"没有这样的列:已批准"错误.

forms.py

    from django …
Run Code Online (Sandbox Code Playgroud)

python django threaded-comments django-mptt

18
推荐指数
1
解决办法
1906
查看次数

如何重建我的django-mptt树?

我正在使用django-mptt 0.4.2,并希望重建一棵树.

树管理器有一个方法rebuild(),我试图像这样访问:

>>> my_rootnode = MyObj.objects.get(id=12)
>>> my_rootnode.tree.rebuild()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 211, in __get__
    raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
AttributeError: Manager isn't accessible via MyObj instances
Run Code Online (Sandbox Code Playgroud)

我显然做错了.我该如何访问重建方法?

django django-mptt

16
推荐指数
4
解决办法
9490
查看次数

检索mptt查询集的祖先的查询集的高效函数

有没有人有一个有效的算法来检索一个mptt查询集的所有祖先?到目前为止我能想到的最好的是这样的:

def qs_ancestors(queryset):
    if isinstance(queryset, EmptyQuerySet):
        return queryset
    queryset_aggs = queryset.values_list('tree_id', 'level').annotate(max_lft=Max('lft'), min_rght=Min('rght'))
    new_queryset = queryset.none()
    for tree_id, level, max_lft, min_rght in queryset_aggs:
        ancestors = MyModel.objects.filter(
           tree_id=tree_id,
           level__lt=level, 
           lft__lte=max_lft,
           rght__gte=min_rght,
        )
        new_queryset = ancestors | new_queryset
    return new_queryset
Run Code Online (Sandbox Code Playgroud)

这种方法存在两个问题:

  1. 如果存在彼此不相邻的分支(即它确实不起作用),它将失败
  2. 这是非常低效的,因为它最终number_of_trees*number_of_levels在最终查询中有条款,它可以非常快地变得非常大

我愿意在其他地方缓存祖先,但我想不出有效的方法.我考虑添加一个字段,用逗号分隔的祖先id的列表,然后GROUP_CONCAT在一个额外的内部做一个(我在MySQL中),但我认为这可能会变得很大/很慢.

python django mptt django-mptt hierarchical-data

15
推荐指数
2
解决办法
2981
查看次数

升级版本django-mptt后为什么会出现此数据库迁移错误?

我的Django的应用程序有一个requirements.txt文件(如图所示这里),我用我的虚拟环境中安装的模块.一切正常.

但是,我现在正在尝试将django-mptt从0.6.1升级到最新版本.(其实我不在乎升级Django的MPTT.我只是想升级版本的Django的,但它似乎升级Django的,所描述的我必须先升级Django的MPTT 这里).所以我这样做pip install -U django-mptt.这导致django-mptt从0.6.1变为0.7.4,Django从1.7.1变为1.8.2.它还会导致django-cache-machine从origin到master.您可以在下面的屏幕截图中看到更改.

然后当我这样做manage.py runserver然后提示我迁移.所以我这样做.没问题.但是随后如果我删除所有表然后再次运行迁移,我在迁移期间会收到此错误:

django.db.utils.OperationalError: 
(1005, 'Can\'t create table `mydb_instance`.`#sql-21b_1e` 
(errno: 150 "Foreign key constraint is incorrectly formed")')
Run Code Online (Sandbox Code Playgroud)

完整堆栈跟踪在这里.

这个错误是什么?是否与我使用MariaDB(服务器版本:10.0.15-MariaDB Homebrew)而不是MySQL作为我的数据库这一事实有关?

在此输入图像描述

编辑:以下部分该点已于2015年7月6日5:28 UTC添加

我在上面提到过,升级后,我被提示进行迁移.奇怪的是,即使升级MPTT不会导致创建任何新的迁移文件,也会发生这种情况!当我这样做时manage.py runserver,我收到了以下警告信息.为什么?这没有道理:

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
Run Code Online (Sandbox Code Playgroud)

编辑:以下部分该部分已于2015年7月6日17:00 UTC加入

作为实验,我将基础数据库从MariaDB切换到MySQL(服务器版本:5.6.25).问题依然存在.我得到的错误是Cannot add foreign key constraint.完整的堆栈跟踪在这里.

编辑:这个点以下这个点在2015年7月6日在17:05 UTC上添加

通过我在5分钟前发布的堆栈跟踪,我发现错误是由以下SQL语句触发的:

ALTER TABLE `myapp2_mymodel2` ADD CONSTRAINT …
Run Code Online (Sandbox Code Playgroud)

mysql django database-migration django-models django-mptt

14
推荐指数
1
解决办法
658
查看次数

Django和MPTT - 只获取叶节点

我是Django和MPTT的新手,并且很难弄清楚如何获取所有叶子节点并将它们直接发送到Form类.例如,我创建了MPTT类别模型,并具有以下层次结构:

  • 组别
    • 产品组别
    • 类别3
  • 分类四
    • 类别5
    • 类别6

所以我只想获得叶子类别(cat2,3,5,6).我的Form类看起来像这样:

class UploadForm(forms.Form):
    description = forms.CharField(max_length=50)
    category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.all())
    file = forms.FileField() 
Run Code Online (Sandbox Code Playgroud)

并且使用queryset = Category.objects.all()我得到完全相同的东西 - 所有类别及其子节点.有一种方法我只能得到叶节点(子节点),但所有类别的叶子节点,而不是特定的类别实例?谢谢.

django django-mptt

12
推荐指数
2
解决办法
3784
查看次数

如何使用Django mptt查询节点的所有子节点的对象?

我试图用django-mppt获取Django上给定节点的所有子节点的对象

我有一个如下所示设计的模型,具有相同缩进级别的类/类别(节点)定义兄弟,内部缩进是子.标有类别的对象显示在类别(节点)下方.对象以-符号开头.类/类别(节点)中的数字是ids.

所有节点都是Category具有id给定的类的实例.

high school (1)
    class 8 (2)
        division a (3)
            -Billie
            -Tre
            -Mike

        division b (4)
            -Patrik
            -Pete
            -Andy
    class 9 (3)
        division a (8)
            -Mark
            -Tom
            -Travis

        division b (5)
            -Gerard
            -Frank
            -Mikey

    class 10  (4)
        division a (6)
            -Hayley
            -Jeremy
            -Taylor

        division b (7)
            -Steven
            -Slash
            -Izzy
Run Code Online (Sandbox Code Playgroud)

我可以通过这种方式获取特定节点的查询集,

>>> Category.objects.get(pk=7).product_set.all()
[Steven, Slash, Izzy]


>>> Category.objects.get(pk=4).product_set.all()
[Mark, Tom, Travis]
Run Code Online (Sandbox Code Playgroud)

我怎样查询pk=1,pk=2,pk=3pk=4让所有的子对象?

例,

查询的pk=2 …

python django mptt tree-traversal django-mptt

10
推荐指数
2
解决办法
5919
查看次数

如何从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和多个父母?

在这个问题上,我一直在桌子上撞了几个星期,所以我觉得可能是时候寻求帮助了.

我正在尝试实现一个数据库结构,它具有程序集部件的分层数据.我的主要问题在于尝试将一个"子组件"分配给另一个"组件"/树.参考下面的示例树 - 我在创建和使用程序集1和2时没有任何问题.但是当我进行程序集3时,当我调用子程序集时,我得到多个对象返回错误(我根据我的方式理解)尝试).

assembly 1:    assembly 2:     assembly 3:
1.1            2.1             2.1
- 1.1.1        - 2.1.1         - 2.1.1
1.2            2.2             1.2
- 1.2.1        - 2.2.1         - 1.2.1               
Run Code Online (Sandbox Code Playgroud)

这是我一直在尝试的模型:

#models.py snippet
class Part(models.Model):
        part_name = models.CharField(max_length=30, primary_key=True)
        description = models.TextField(max_length=500, blank=True, null=True)
        revision = models.CharField(max_length=10, blank=True, null=True)

        def __unicode__(self):
                return u'%s' % (self.part_name)

class Assembly(MPTTModel):
        name = models.ForeignKey(Part)
        parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

        def __unicode__(self):
                return u'%s' % (self.name)

#views.py snippet
def assembly_details(request, assembly_name):
        context_instance=RequestContext(request)
        assembly = Assembly.objects.get(name=assembly_name)
        descendants_list …
Run Code Online (Sandbox Code Playgroud)

django django-models django-mptt

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

django-mptt中的动态顺序

我正在为我的评论应用程序使用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] …
Run Code Online (Sandbox Code Playgroud)

python django django-mptt

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