【问题标题】:How to access a field in a related django model other than the primary key如何访问除主键之外的相关 django 模型中的字段
【发布时间】:2014-02-11 16:45:36
【问题描述】:

这似乎是一个愚蠢而简单的问题。我正在兜圈子试图完成这项工作,但我看不到树木的树林。

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

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)

如何添加引用 Location 模型中的“tel”字段的字段,以便可以自动填充或从 Django 管理中的选择列表中填充。

【问题讨论】:

  • 那么,您要访问还是添加一个字段?
  • 如果您想访问来自InformationRequest 实例的tel 字段,您只需这样做:instance.source.tel。除此之外,我不确定问题是什么,抱歉:)
  • 对不起,我不是很清楚。
  • 对不起,我不是很清楚。如何将属性添加到 InformationRequest 模型(例如,以“contact_tel = models.ForeignKey(....)”的形式),以便 Location.tel 字段中存储的值使用适当的值填充 InformationRequest.contact_tel 字段对于链接的记录。也就是说,如果 ID/pk = '1' 的 Location.tel = '123',InformationRequest.contact_tel 与 InformationRequest.source = '1' 的记录相同。抱歉,不知道该怎么解释。

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


【解决方案1】:

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

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

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

...您可以像这样从InformationRequest 实例访问tel

>>> 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'

无论如何,您应该以编程方式解决它。希望对您有所帮助。

【讨论】:

  • 我想你已经猜到我想做什么了。我同意你关于冗余位的观点,但我正在尝试进行思考练习(这些模型是我正在研究的东西的简化版本)并且我一生都不知道如何把它弄出来虽然我以前看过解决方案......太令人沮丧了!稍后我将尝试复制您的解决方案。非常感谢您让我重回正轨。
  • 本质上你的解决方案是有效的,尽管美中不足,可以这么说。如果我可以问一个补充问题:InformationRequest 模型的“contact_tel”属性可以在 ModelAdmin 的 list_display 中看到,但是如果我尝试将其添加到一个字段集 - 我还缺少什么??
  • 问题是您无法编辑contact_tel,因为它不是一个字段(如数据库中的列中)。 list_display 很好,因为它只显示内容,但字段集包含可以编辑的实际模型字段。如果要显示(和编辑)相关模型中的字段,则需要研究内联的概念。在这里挖掘:docs.djangoproject.com/en/1.6/ref/contrib/admin/…
  • pythonsvili - 非常感谢 - 感谢您花费的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2021-11-02
  • 2018-04-22
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多