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

これを使用して、カテゴリ階層を設定します。一部のカテゴリの親カテゴリには、親カテゴリなども持つ親カテゴリがあります。__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

あなたが説明しているのはツリー構造であり、再帰的な外部キー関係のすべての親要素を反復処理することは、残念ながら非常に高価な操作です。他の回答が実行方法を示しているため、親のすべてのルックアップには1つのデータベースヒットが必要です。

代わりに、効率的なツリー クエリを可能にするテーブル構造を使用することをお勧めします。これを行うにはいくつかの方法がありますが、正しい方向に向けるために、django-mpttまたはdjango-treebeardを調べることをお勧めします。

たとえば、django-mptt を使用すると、次の一般的な構造でこれを実現できます。これにより、ターゲット カテゴリのすべての祖先をクエリするためのデータベース ヒットが 1 つだけ追加されます。

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 に答える
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 に答える
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 に答える