Python 在父外键上循环
我在Django项目中有一个模型,如下所示:Python 在父外键上循环,python,django,Python,Django,我在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 我用它来设置类别继承人。有些类别父类别有一个父类别
class Category(models.Model):
parentCategory = models.ForeignKey(Category,null=True,blank=True)
category = models.CharField(max_length=255)
def __unicode__(self):
return self.category
我用它来设置类别继承人。有些类别父类别有一个父类别,也有一个父类别等。我想知道如何在\uuuu unicode\uu
方法中循环这个结构
干杯,
本
更新:
以下是我的类别表中的结构:
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
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()
有什么想法吗?怎么样
def __unicode__(self):
str = self.category
obj = self
while obj.parentCateogry:
str += " " + obj.parentCategory.category
obj = obj.parentCategory
return str
您可以这样做:
Parent
Parent -> Sub Parent
Parent -> Sub Parent -> Sub Sub Parent
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()
您所描述的是一个树结构,而迭代递归外键关系的所有父元素不幸是一个非常昂贵的操作;对于父项的每次查找都需要一次数据库命中,正如其他答案演示的那样 我建议您改为使用允许高效树查询的表结构。有几种方法可以做到这一点,但为了给你指出正确的方向,我建议你研究一下或 例如,使用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)
另外,如果你想拥有自引用密钥,你可以这样做
models.ForeignKey('self',null=True,blank=True)
hmm就快到了。。只是有点颠倒了。。如果是父母,它会显示孩子。。但孩子们不会让父母看到。事实上,我只想让父母知道它有一个。这里有更多的例子: