我想从同一模型中访问自我模型:
我想得到并显示每个类别项目的所有父项(如果存在)
class Category(models.Model):
title = models.CharField(...)
parent_id = models.ForeignKey("Category")
ref_id = models.CharField(...)
def __unicode__(self):
p1 = None
p2 = None
p3 = None
final = ''
p3 = self
if p3.parent_id:
p2 = self.__class__.objects.get(id=p3.parent_id)
if p2.parent_id:
p1 = self.__class__.objects.get(id=p2.parent_id)
final = smart_text('{}-{}-{}').format(p1.title,p2.title,p3.title)
else:
final = smart_text('{}-{}').format(p2.title,p3.title)
else:
final = smart_text('{}').format(p3.title)
return final
答案 0 :(得分:1)
char s[] = "test";
^^
答案 1 :(得分:0)
有一些概念上的错误!
如果要创建外键字段, Django会自动将_id添加到字段名称,同时将其保存在数据库中。因此,您的foreign_key的名称不应包含_id,只需将其命名为 parent
所以你的模型应该是:
class Category(models.Model):
title = models.CharField(...)
parent = models.ForeignKey('self') # column name in the db: parent_id
第二件事,当选择实例的foreign_key时,它返回实际的实例,而不是它的id。示例(使用上述模型):
c = Category.objects.get(id=1)
c_parent = c.parent # will be the instance of parent, not parent's id
c_parent_id = c.parent_id # = c.parent.id, actual id of parent
所以你的最终模特可以是:
class Category(models.Model):
title = models.CharField(...)
parent = models.ForeignKey('self')
def __unicode__(self):
p1 = p2 = p3 = None
final = ''
p3 = self
p2 = p3.parent
if p2:
p1 = p2.parent
if p1:
final = smart_text('{}-{}-{}').format(p1.title, p2.title, p3.title)
else:
final = smart_text('{}-{}').format(p2.title, p3.title)
else:
final = smart_text('{}').format(p3.title)
return final
如果您现在无法更改模型(尽管我建议尽快更改模型),那么这就是正在发生的事情:
self.parent_id
实际上是指父母实例(使用self.parent_id_id
表示实际ID)尽管如此,您实际上并不需要父母的身份证明,您可以简单地将父母视为self.parent_id
,这是您最终要找到的。