如何将Django MPTT与多个树一起使用?

如何将Django MPTT与多个树一起使用?,django,binary-tree,django-mptt,Django,Binary Tree,Django Mptt,我计划将Django MPTT与多租户体系结构结合使用,因此将有许多站点主页,并且我不希望每次用户更改其About Us页面的位置时都必须重建整个页面表的MPTT字段。我宁愿重建那个用户的网站。这可能吗?只需为每棵树使用不同的树id值即可。我尝试过,我将第二棵树加载到同一个表中。一方面,Django MPTT为新的树枝提供了新的树id。这样看来,它似乎起了作用。另一方面,现在使用来自Django MPTT站点的模板不会显示节点的名称。我附上一张屏幕截图。当表中只有一棵树时,模板工作得非常好。我没

我计划将Django MPTT与多租户体系结构结合使用,因此将有许多站点主页,并且我不希望每次用户更改其About Us页面的位置时都必须重建整个页面表的MPTT字段。我宁愿重建那个用户的网站。这可能吗?

只需为每棵树使用不同的树id值即可。

我尝试过,我将第二棵树加载到同一个表中。一方面,Django MPTT为新的树枝提供了新的树id。这样看来,它似乎起了作用。另一方面,现在使用来自Django MPTT站点的模板不会显示节点的名称。我附上一张屏幕截图。当表中只有一棵树时,模板工作得非常好。我没有对任何代码做任何更改,我只是在表中放了第二棵树,然后就开始了!名单上没有名字

这棵树的结构看起来是一样的。当我访问另一棵树时,我也没有名字,我可以访问这棵树,除了没有名字

以下是模型定义:

class EbayCategory(MPTTModel):
    iCategoryID     = models.PositiveIntegerField( 'ebay category number',
                        db_index=True )
    name            = models.CharField(
                        'ebay category description', max_length = 50 )
    iLevel          = models.PositiveSmallIntegerField(
                        'ebay level (top is 1, lower levels are bigger numbers)' )
    iParentID       = models.PositiveIntegerField( 'ebay parent category' )
    bLeafCategory   = models.BooleanField( 'leaf category?' )
    iTreeVersion    = models.PositiveSmallIntegerField( 
                        'category tree version' )
    iMarket         = models.ForeignKey( Market, verbose_name = 'ebay market' )
    iSupercededBy   = models.PositiveIntegerField(
                        'superceded by this ebay category', null = True )
    parent          = TreeForeignKey( 'self',
                        null=True, blank=True, related_name='children',
                        db_index=True)

    def __str__(self):
        return self.name

    class Meta():
        verbose_name_plural = 'ebay categories'
        db_table        = 'ebay_categories'
        unique_together = ('iCategoryID', 'iMarket',)

    class MPTTMeta:
        order_insertion_by = ['name']
除parent之外的所有列都来自ebay API

此时,我没有已替换的类别,因此所有行的isupersedby列都为null。我还没有经历过易趣目录列表的更新,所以每个市场的所有行都是与当前版本相同的易趣目录树

该视图选择“按市场”和“易趣树版本”,这两个值均来自“市场”表:

def show_ebay_categories(request, sMarket):
    iMarket = Market.objects.get( cMarket = sMarket.upper() )
    context = { 'nodes':EbayCategory.objects.filter(
        iMarket = iMarket, iTreeVersion = iMarket.iCategoryVer ) }
    return render(request, 'ebaycategories/ebay_categories.html', context)
在添加到第二个树之前,对数据库的副本运行相同的代码,名称会显示出来

添加第二棵树似乎以重建无法修复的方式损坏了表。我删除了第二棵树。还是没有名字。我重建了这棵树:

还是没有名字。我截短了表格,然后重新上传了第一棵树。还是没有名字。我又重建了那棵树。还是没有名字

工作原理:导入数据时向每个类别列表树添加根节点。从易趣下载的数据不包括根节点

请注意列表顶部的EBAY-US版本117 Root


我在将第二棵树导入同一个表后生成了清单。因此,是的,它可以工作。

文档说明。。。你应该认为树ID是易挥发的,我想它会起作用,但对我来说似乎很危险。