2

我的 Django 项目中有一个模型,如下所示:

class Category(models.Model):
   parentCategory = models.ForeignKey(Category,null=True,blank=True)
   category = models.CharField(max_length=255)

   def __unicode__(self):
       return self.category

我用它来设置类别 heirachy。一些类别的父类别有一个父类别,也有一个父类别等。我想知道如何在__unicode__方法中循环这个结构?

干杯,本

更新: 以下是我的类别表中的结构:

Parent
Parent -> Sub Parent
Parent -> Sub Parent -> Sub Sub Parent

Aamir Adnan 的“get_name”函数正在返回:

Parent
Sub Parent -> Sub Sub Parent
Sub Sub Parent

我需要它显示如下:

Parent
Parent -> Sub Parent
Parent -> Sub Parent -> Sub Sub Parent

有任何想法吗?

4

3 回答 3

3

怎么样..

   def __unicode__(self):
       str = self.category
       obj = self
       while obj.parentCateogry:
            str += " " + obj.parentCategory.category 
            obj = obj.parentCategory
       return str
于 2013-02-27T21:18:37.530 回答
3

您所描述的是树结构,不幸的是,遍历递归外键关系的所有父元素是一项非常昂贵的操作;每次查找父项都需要一次数据库命中,因为其他答案演示了执行方法。

我建议您改为使用允许高效树查询的表结构。有几种方法可以做到这一点,但为了给你指明正确的方向,我建议你研究django-mpttdjango-treebeard

例如,使用 django-mptt,您可以使用以下通用结构实现此目的,这只会导致额外的数据库命中来查询目标类别的所有祖先。

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey


class Category(MPTTModel):
    name = models.CharField(max_length=255)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

    def __unicode__(self):
        ancestors = self.get_ancestors(ascending=False, include_self=True)
        return ' -> '.join(category.name
                           for category in ancestors)
于 2013-03-03T04:55:42.813 回答
1

你可以这样做:

class Category(models.Model):
    parentCategory = models.ForeignKey('self', null=True, blank=True,
        related_name="categories")
    category = models.CharField(max_length=255)

    def get_name(self, obj, name=''):
        name += ' - ' + obj.category
        categories = obj.categories.all()
        if categories:
            for category in categories:
                name = self.get_name(category, name)
            return name
        else:
            return name

    def __unicode__(self):
        return self.get_name(self).strip(' - ').strip()
于 2013-02-27T21:20:30.467 回答