1

我正在尝试创建 unicode,并且我想从继承表中获取该字段。像这样:

 class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
        )
    ...........        

class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
        )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.name)

请注意,我在 Envelope 模型中创建 unicode,并且试图从 EnvelopeBase 模型中获取“self.name”。我没有收到错误,但输出为空。如何将 ENvelopeBase 模型中的名称字段访问到 Envelope 模型?

更新:

我正在尝试做的是像这样显示类别和信封名称,例如:

假设我有类别 = '储蓄' 和信封 = '维护'

输出必须是(来自 unicode 实现):

 def __unicode__(self):
    //the self.name here return null
    return "{0}: {1}".format(self.category, self.name)

 Output: "Savings: maintenance"

但我的问题只是*节省 (类别) *显示没有维护 (信封)。self.name 来自 EnvelopeBase 模型,我正在尝试访问 Envelope 模型

4

2 回答 2

2

在 django 模型中使用继承时,会为父模型和子模型创建两个表。一个名为 Parent_ptr_id 的外键列被添加到子模型中,用于引用父表中的相应行。

假设我们有两个模型(父母和孩子):

class Parent(models.Model):
    parent_field = models.CharField(max_length=50)
    def __unicode__(self):
        return self.parent_field

class Child(Parent):
    child_field = models.CharField(max_length=50)
    def __unicode__(self):
        return self.parent_field + ': ' + self.child_field

当您创建子模型的实例时,您也应该指定 parent_field。

child = Child(child_field='a', parent_field='b')

如果您不指定 parent_field,则插入的新父行将 parent_field 设置为 null。这可能发生在您的数据上。

此外,当您创建子模型的实例时,您可以指定现有的 parent_ptr_id。

child = Child(child_field='c', parent_field='d', parent_ptr_id=1)

这会导致现有父级的 parent_field 更新为新值。棘手的部分是,如果您未在此处指定 parent_field,则现有父行中的 parent_field 将更新为 null。这也可能发生在您的数据上。

除此之外,您现有的代码应该可以工作。(据我所知,不需要 self.envelopebase.name)

于 2013-03-05T05:46:30.377 回答
1

你想让你的基本模型抽象https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
    )

    ...........

    class Meta:
        abstract = True


class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
    )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.name)

另一种方式是多表继承https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

基本上,您无需执行任何操作。Django 会自动在两者之间创建一对一的关系。基类中的所有字段都将在父类中可用,但数据将存在于不同的表中。

class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
    )

    ...........


class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
    )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.envelopebase.name)
于 2013-03-05T04:36:13.100 回答