在django中从自我模型中调用模型

时间:2016-01-16 18:46:44

标签: python django

我想从同一模型中访问自我模型:
我想得到并显示每个类别项目的所有父项(如果存在)

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

2 个答案:

答案 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

如果您现在无法更改模型(尽管我建议尽快更改模型),那么这就是正在发生的事情:

  • 数据库中的 parent_id 字段名称将为 parent_id_id
  • 您的self.parent_id实际上是指父母实例(使用self.parent_id_id表示实际ID)

尽管如此,您实际上并不需要父母的身份证明,您可以简单地将父母视为self.parent_id,这是您最终要找到的。