我打算将Django MPTT与多租户架构一起使用,因此会有很多站点主页,我不希望每次重建整个page
表的mptt feilds用户更改其About Us
页面的位置。我宁愿重建那个用户的网站。这可能吗?
答案 0 :(得分:1)
只需为每棵树使用不同的tree_id
值。
答案 1 :(得分:-1)
我试过了,我把第二棵树装进了同一张桌子。一方面,Django MPTT为新的树枝提供了新的tree_id。所以就这样,它似乎有效。另一方面,现在使用Django MPTT站点的模板不会显示节点的名称。 (我附上了一个屏幕截图。)当表格中只有一棵树时,模板工作得很好。我没有改变任何代码等等,我只是把第二棵树放在桌子上,然后!列表中没有名称。
树的结构看起来一样。当我访问另一棵树时,我也没有名字,我可以访问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)
在添加第二个树之前,对着数据库的副本运行相同的代码,名称会显示出来。
似乎添加第二个树以一种重建无法修复的方式损坏了表。我删除了第二棵树。仍然没有名字。我重建了树:
How do I rebuild my django-mptt tree?
仍然没有名字。我截断了表格,然后重新上传了第一棵树(ebay USA类别)。仍然没有名字。我又重建了这棵树。仍然没有名字。
工作原理:导入数据时,将根节点添加到每个类别列表(树)。 (从ebay下载的数据不包括根节点,)
注意“EBAY-US版本117 Root”位于列表顶部。
我在将第二棵树导入同一张桌后生成了列表。所以是的它可以工作。