mik*_*725 3 django django-mptt hierarchical-data
我正在开发一个hirerchical应用程序,其中叶节点可以是不同模型的实例.我无法弄清楚如何使它与django-mptt应用程序一起工作.这个应用程序甚至可以实现吗?如果是的话,我做错了什么?如果没有,那里有什么我想做什么?
以下是模型的基本结构:
class FolderItemBase(MPTTModel):
order = models.PositiveIntegerField()
class Meta:
abstract = True
class MPTTMeta:
parent_attr = 'folder'
order_insertion_by = ['order']
class Folder(FolderItemBase):
folder = TreeForeignKey('Folder', related_name='folders', blank=True, null=True)
...
class Image(FolderItemBase):
folder = TreeForeignKey('Gallery', related_name='images') # cannot be null since leaf has to be inside of a folder
...
Run Code Online (Sandbox Code Playgroud)
当我尝试执行以下操作时,我只能获取"文件夹"子项,而没有任何图像.当我试图获得图像的祖先时也是如此
>>> folder1 = Folder.objects.create(title='Folder 1', order=0)
>>> folder2 = Folder(title='Folder 2', order=0)
>>> folder2.insert_at(folder1, save=True)
>>> image = Image(...)
>>> image.insert_at(folder1, save=True)
>>> folder1.get_children()
[<Folder: Folder 2>]
>>> image.get_ancestores()
[]
Run Code Online (Sandbox Code Playgroud)
这就是在所有这些之后事物存储在数据库中的方式:
Folder table
----------------
+----+-------+-----+------+---------+-------+-----------+----------+
| ID | order | lft | rght | tree_id | level | folder_id | title |
+----+-------+-----+------+---------+-------+-----------+----------+
| 1 | 0 | 1 | 4 | 1 | 0 | | Folder 1 |
+----+-------+-----+------+---------+-------+-----------+----------+
| 2 | 0 | 2 | 3 | 1 | 1 | 1 | Folder 2 |
+----+-------+-----+------+---------+-------+-----------+----------+
Images Table
------------
+----+-------+-----+------+---------+-------+-----------+
| ID | order | lft | rght | tree_id | level | folder_id |
+----+-------+-----+------+---------+-------+-----------+
| 1 | 1 | 2 | 3 | 1 | 1 | 1 |
+----+-------+-----+------+---------+-------+-----------+
Run Code Online (Sandbox Code Playgroud)
正如你可以看到它的数字应该是什么形象和正确的级别数(在至少这似乎是)左右的数字但它不那么然后更新文件夹表格什么,当你尝试做一个查询什么都没有被选中.
任何指针都表示赞赏.谢谢.
AFAIK,这是不可能的; django-mptt支持Django的QuerySet,它只能用于某种类型的东西.您可以使用contenttypes框架将"真实"项与类似的内容相关联FolderItem,这些内容仅用于层次结构,例如
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class FolderItem(MPTTModel):
folder = TreeForeignKey('Folder', related_name='folders', blank=True, null=True
order = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Meta:
abstract = True
class MPTTMeta:
parent_attr = 'folder'
order_insertion_by = ['order']
Run Code Online (Sandbox Code Playgroud)
然后,当您使用django-mptt管理器方法等时,您将获得FolderItems的查询集,并且可以通过通用外键在遍历集合时访问Folder/ Image为每个.
但是,请注意,这在数据库查询方面可能会很昂贵,因为每次访问通用外键时,都必须发出新的查询.
| 归档时间: |
|
| 查看次数: |
1580 次 |
| 最近记录: |