Python 从django中的自模型中调用模型
我想从同一模型中访问自模型:Python 从django中的自模型中调用模型,python,django,Python,Django,我想从同一模型中访问自模型: 我希望获取并显示每个类别项的所有父项(如果存在) 有一些概念层面的错误 如果要创建外键字段,Django会在将字段名保存到数据库中时自动将_id添加到字段名中。因此,外键的名称不应包含_id,只需将其命名为parent即可 因此,您的模型应该是: class Category(models.Model): title = models.CharField(...) parent = models.ForeignKey('self') # col
我希望获取并显示每个类别项的所有父项(如果存在)
有一些概念层面的错误 如果要创建外键字段,Django会在将字段名保存到数据库中时自动将_id添加到字段名中。因此,外键的名称不应包含_id,只需将其命名为parent即可 因此,您的模型应该是:
class Category(models.Model):
title = models.CharField(...)
parent = models.ForeignKey('self') # column name in the db: parent_id
第二件事,当选择实例的外键时,它返回实际实例,而不是它的id。例如(使用上述模型):
因此,您的最终模型可以是:
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
如果您现在无法更改您的模型(尽管我建议尽快更改),那么将发生以下情况:
- 数据库中的父id字段名称将是父id
- 您的
实际上引用了父实例(使用self.parent\u id
作为实际id)self.parent\u id
尽管如此,您实际上不应该需要父级id,您只需将父级作为
self.parent\u id
,这是您最终要查找的。您说得对,但是,我想要一个可以过滤对象的self模型实例,您可以通过查询集进行过滤。但是self
将是一个单独的实例!您不能对单个实例进行筛选。@Burhan Khalid我想要一种可以调用自模型并再次筛选对象的方法,例如按标题筛选或按id筛选等。您的意思是这样的吗<代码>self.\uuuuu类\uuuuu.objects.filter(title=x)是,但它返回错误“int()参数必须是字符串或数字,而不是“Category””。您试图解决的问题是什么?
class Category(models.Model):
title = models.CharField(...)
parent_id = models.ForeignKey('Category',null=True,blank=True)
ref_id = models.CharField(...)
def __unicode__(self):
if self.parent_id:
return self.get_title()
return self.title
def get_title(self):
title = '%s-%s'%(self.title,self.parent_id.title)
parent = self.parent_id
while True:
if parent.parent_id:
title+= '-%s'%parent.parent_id.title
parent = parent.parent_id
break
return title
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
class Category(models.Model):
title = models.CharField(...)
parent_id = models.ForeignKey('Category',null=True,blank=True)
ref_id = models.CharField(...)
def __unicode__(self):
if self.parent_id:
return self.get_title()
return self.title
def get_title(self):
title = '%s-%s'%(self.title,self.parent_id.title)
parent = self.parent_id
while True:
if parent.parent_id:
title+= '-%s'%parent.parent_id.title
parent = parent.parent_id
break
return title