2013-03-05 34 views
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) 

注意,我在信封模型创建Unicode,我试图让“self.name”,这是从EnvelopeBase模型。我没有得到错误,但输出为空。如何访问Envelope模型中的ENvelopeBase模型中的名称字段?

UPDATE:

我想要做的就是这样的,例如显示分类和信封名称:

让说我有类=“储蓄”和包络=“维护”

输出必须是(从Unicode的实现):

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

Output: "Savings: maintenance" 

但我的问题是ONL ÿ* 储蓄(类别) *无需维护(信封)。该self.name是从中我试图访问外围模型

+0

你能展示一个关于如何使用这些模型来获得意外输出的简化代码片段吗? – 2013-03-05 04:00:28

+0

感谢您的更新。我正在寻找这样的东西: 'envelope = Envelope(name ='Sam',category = some_category_instance); envelope.save(); print(envelope); print(envelope .__ unicode __())' 根据您当前的模型,输出结果会是什么样的? – 2013-03-05 04:17:59

+0

@ZebDeOs我没有保存它。我试图展示他们。 – catherine 2013-03-05 04:24:15

回答

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)

+0

非常酷,我实际上不知道这种关系类型,直到她提到她不想要抽象。感谢澄清。 – Ngenator 2013-03-05 12:26:36

+0

欢呼,希望它有帮助。 – jurgenreza 2013-03-05 15:52:42

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) 

另一种方式EnvelopeBase模型MULT表继承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) 
+0

谢谢,但不要使用抽象。该EnvelopeBase模型也处理数据库中的数据 – catherine 2013-03-05 04:47:48

+0

我真的陷入了这个问题...... – catherine 2013-03-05 04:48:14

+0

我相信你不正确地使用模型继承。 – Ngenator 2013-03-05 04:50:14