Frage

I got the following models:

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')

Let's say i have the following categories in the database:

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

I can get the top category by doing the following:

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

But that's not nice because a product can be x numbers of categories deep.

How can I get all the related categories in an array or something?

Wanted output = [iPhones, Phones, Products]
War es hilfreich?

Lösung

Write a Model Property Method for the item class:

  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))

Now you can get the desired list with

product.all_categories
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top