如何访问除主键之外的相关django模型中的字段

时间:2014-02-11 16:45:36

标签: class django-models foreign-key-relationship

这似乎是一个愚蠢而简单的问题。我试图去做这项工作,但是我不能看到木头的树木。

给出一个简单的模型,例如(我已经跳过了导入):

class Location(models.Model):
    description = model.CharField(max_length=40)
    address1 = model.CharField(max_length=40)
    # ..... (and so on)
    tel = model.CharField(max_length=12)

和另一个与它有关系的人:

class InformationRequest(models.Model):
    source = models.ForeignKey(Location)
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

如何添加引用' tel'的字段?来自Location模型的字段,可以自动填充,也可以从Django admin中的选择列表填充。

1 个答案:

答案 0 :(得分:1)

好的,如果我说得对,那么,nomen est omen,彻底混淆了关系数据库的工作方式:]关键原则之一是消除冗余。两个表中不应存储彼此相关的完全相同的数据。

我认为您当前的模型是正确的。鉴于这些情况(我忽略了你有其他不可空字段的事实)......

>>> loc = Location()
>>> loc.tel = "123"
>>> loc.save()
>>> info = InformationRequest()
>>> info.source = loc
>>> info.save()

...您可以从tel实例访问InformationRequest,如下所示:

>>> info.source.tel
'123'

您还可以创建方法......

class InformationRequest(models.Model):
    source = models.ForeignKey(Location, related_name="information_requests")
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

    def contact_tel(self):
        return self.source.tel

......并且像这样:

>>> info.contact_tel()
'123'

你甚至可以把它变成属性......

class InformationRequest(models.Model):
    source = models.ForeignKey(Location, related_name="information_requests")
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

    @property
    def contact_tel(self):
        return self.source.tel

......并且没有括号:

>>> info.contact_tel
'123'

无论如何,你应该以编程方式绕过它。希望有所帮助。