1

我有以下型号:

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]
4

1 回答 1

4

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

  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
于 2014-03-19T12:44:46.080 回答