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
    实际上引用了父实例(使用
    self.parent\u id
    作为实际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