获取所有父类别Django - 关注外键UP

时间:2014-03-19 12:18:42

标签: django foreign-key-relationship categories django-select-related django-related-manager

我有以下型号:

class Category(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey("self", blank=True, null=True)

    class Meta:
        verbose_name = _("category")
        verbose_name_plural = _("categories")

     def __unicode__(self):
         return self.name


class Item(models.Model):
     name = models.CharField(max_length=100, verbose_name=_("name"))
     keywords = models.CharField(max_length=255, verbose_name=_("keywords"))
     category = models.ForeignKey(Category)

     class Meta:
         abstract = True
         verbose_name = _('item')
         verbose_name_plural = _('items')


class Product(Item):
    price = models.DecimalField(decimal_places=2, max_digits=8, verbose_name=_("price"))
    brand = models.ForeignKey(Brand, verbose_name=_("brand"))
    article_number = models.CharField(max_length=255, verbose_name=_("article_number"))

    def __unicode__(self):
         return self.name

    class Meta:
        verbose_name = _('product')
        verbose_name_plural = _('products')

假设我在数据库中有以下类别:

ID     NAME      PARENT_ID
1      Products       null
2      Phones            1
3      iPhones           2

我可以通过以下方式获得最高类别:

#This is a product with the category "iPhones"
product.category.parent.parent

但这并不好,因为一个产品可以是x个很深的类别。

如何获取数组中的所有相关类别?

Wanted output = [iPhones, Phones, Products]

1 个答案:

答案 0 :(得分:2)

为项目类编写模型属性方法:

  class Item(models.Model):
     @property
     def all_categories(self):
        categories = []
        current_category = self.category
        while current_category is not None:
            categories.append(current_category)
            current_category = current_category.parent
        return categories
        #optional return reversed list:
        #return list(reversed(categories))

现在,您可以使用

获取所需的列表
product.all_categories