如何使用多个树的Django-MPTT?

时间:2012-04-25 15:31:33

标签: django binary-tree django-mptt

我打算将Django MPTT与多租户架构一起使用,因此会有很多站点主页,我不希望每次重建整个page表的mptt feilds用户更改其About Us页面的位置。我宁愿重建那个用户的网站。这可能吗?

2 个答案:

答案 0 :(得分:1)

只需为每棵树使用不同的tree_id值。

答案 1 :(得分:-1)

我试过了,我把第二棵树装进了同一张桌子。一方面,Django MPTT为新的树枝提供了新的tree_id。所以就这样,它似乎有效。另一方面,现在使用Django MPTT站点的模板不会显示节点的名称。 (我附上了一个屏幕截图。)当表格中只有一棵树时,模板工作得很好。我没有改变任何代码等等,我只是把第二棵树放在桌子上,然后!列表中没有名称。enter image description here

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

以下是模型定义:

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']

除了父级之外的所有列都来自ebay API。

此时,我没有被取代的类别,因此所有行的iSupercededBy列都为null。我还没有经历过ebay catetory list更新,因此每个市场的所有行都是相同的ebay树版本(当前版本)。

视图按市场和ebay树版本选择(两个值均来自Markets表格):

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 categories -- today, using database copy before adding 2nd tree

似乎添加第二个树以一种重建无法修复的方式损坏了表。我删除了第二棵树。仍然没有名字。我重建了树:

How do I rebuild my django-mptt tree?

仍然没有名字。我截断了表格,然后重新上传了第一棵树(ebay USA类别)。仍然没有名字。我又重建了这棵树。仍然没有名字。

工作原理:导入数据时,将根节点添加到每个类别列表(树)。 (从ebay下载的数据不包括根节点,)

ebay categories with root node

注意“EBAY-US版本117 Root”位于列表顶部。

我在将第二棵树导入同一张桌后生成了列表。所以是的它可以工作。