我打算将 Django MPTT 与多租户架构一起使用,因此会有很多站点主页,并且我不希望page
每次用户更改其页面位置时都必须重建整个表的 mptt 字段About Us
。我宁愿只重建那个用户的网站。这可能吗?
2 回答
只需为每棵树使用不同的tree_id
值。
我试过了,我将第二棵树加载到同一张表中。一方面,Django MPTT 将新的 tree_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。
此时,我没有已被取代的类别,因此 iSupercededBy 列对于所有行都是空的。我还没有经历过 ebay 目录列表更新,所以每个市场的所有行都是相同的 ebay 树版本(当前版本)。
该视图按市场和 ebay 树版本选择(两个值都来自市场表):
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 USA 类别)。还是没有名字。我再次重建了这棵树。还是没有名字。
工作原理:在导入数据时向每个类别列表(树)添加一个根节点。(从ebay下载的数据不包括根节点,)
请注意列表顶部的“EBAY-US 版本 117 Root”。
我在将第二棵树导入同一个表之后生成了列表。所以是的,它可以工作。