python - 如何在 django 中按父类别订购模型?
问题描述
我有一个模型“类别”,其外键为“parent_category”。如何在 Django 管理列表视图中订购此模型,例如:
- category 1
-- subcategory 1 of category 1
--- subsubcategory 1 of subcategory 1 of category 1
-- subcategory 2 of category 1
-- subcategory 3 of category 1
- category 2
-- subcategory 1 of category 2
-- subcategory 2 of category 2
我尝试了以下方法,但这不起作用。所以我需要一些帮助来订购函数'get_relative_name'。
class PrivateContentCategory(models.Model):
name = models.CharField(
max_length=250,
verbose_name=_('Naam'),
)
slug = models.SlugField(
verbose_name=_('Url'),
blank=True,
)
parent_category = models.ForeignKey(
'self',
on_delete=models.SET_NULL,
related_name='child_category_list',
verbose_name=_('Hoofdcategorie'),
blank=True,
null=True,
)
def __str__(self):
str = self.name
parent_category_obj = self.parent_category
while parent_category_obj is not None:
str = parent_category_obj.name + ' --> ' + str
parent_category_obj = parent_category_obj.parent_category
return str
def get_relative_name(self):
str = self.name
parent_category_obj = self.parent_category
while parent_category_obj is not None:
str = '--' + str
parent_category_obj = parent_category_obj.parent_category
get_relative_name.short_description = _('Naam')
get_relative_name.admin_order_field = [
'parent_category__parent_category',
'name',
]
编辑!!!父类别的名称不应与类别一起显示。我这样写是为了显示应该如何订购模型。列表的显示将是:
- OS
-- Windows
--- Windows 7
--- Windows 8
--- Windows 10
-- Mac
-- Linux
--- Debian
---- Ubuntu
--- Fedora
---- CentOS
---- Oracle Linux
解决方案
对我有用的是向模型添加一个新字段“absolute_name”,该字段将自动填充 pre_save 信号。保存实例后,此字段将包含实例的所有 parent_categories 的名称,然后再包含它自己的名称。最后,我只需要在这个字段上订购实例:
class PrivateContentCategory(models.Model):
name = models.CharField(
max_length=250,
verbose_name=_('Naam'),
)
slug = models.SlugField(
verbose_name=_('Url'),
blank=True,
)
parent_category = models.ForeignKey(
'self',
on_delete=models.SET_NULL,
related_name='child_category_list',
verbose_name=_('Hoofdcategorie'),
blank=True,
null=True,
)
absolute_name = models.TextField(
verbose_name=_('Absolute naam'),
blank=True,
)
def __str__(self):
return self.absolute_name
def get_relative_name(self):
str = self.name
parent_category_obj = self.parent_category
while parent_category_obj is not None:
str = '--' + str
parent_category_obj = parent_category_obj.parent_category
return str
get_relative_name.short_description = _('Naam')
get_relative_name.admin_order_field = [
'absolute_name',
]
class Meta:
verbose_name = _('Privé inhoud categorie')
verbose_name_plural = _('Privé inhoud categorieën')
ordering = [
'absolute_name',
]
@receiver(models.signals.pre_save, sender=PrivateContentCategory)
def pre_save_private_content_category_obj(sender, instance, **kwargs):
# START Generate instance.absolute_name
instance.absolute_name = instance.name
parent_category_obj = instance.parent_category
while parent_category_obj is not None:
instance.absolute_name = parent_category_obj.name + ' --> ' + instance.absolute_name
parent_category_obj = parent_category_obj.parent_category
# END Generate instance.absolute_name
推荐阅读
- python - 将python pandas数据框行或列转换为numpy数组
- google-apps-script - IMPORTXML 错误警报:“内部导入错误” - 如何通过脚本直接导入数据来避免错误?
- python - JsonResponse 中的 Django HttpResponse
- asp.net - 将文件夹中的文件名添加到 DropDownList。(asp.net)
- sql - 名称的括号无效
- python - 在 python 中使用多个线程真的会产生开销(GIL)吗?
- c# - 如何在 C# 中检查 C 指针的有效性?
- python - QLineEdit 使用按钮从鼠标选择中显示选定的文本
- spring - WSO2 ESB 在带有消息队列的集群模式下运行
- java - 为什么使用 jdbcTemplate.query() 从本地发送查询会有 3 秒的本地延迟?