【问题标题】:how to use more than one foreign key in mapping django models如何在映射 django 模型中使用多个外键
【发布时间】:2015-04-22 20:27:42
【问题描述】:

我有一个约会、人员和办公室模型。我知道使用 FOREIGN_KEY.to_field 来匹配 pk 以外的其他内容,但是我如何使它也匹配 office_id?我正在使用 mysql,并且希望尽量减少任何架构更改。

换句话说,如果我需要 Appointment.person,那么它应该返回具有 person.office = office.office_id 的 Appointment.person。

我相信这是关于 django 中的复合键,这是 ORM 的not supported。有一个叫做 unique_together 的东西我可能可以使用,但仍然不确定如何使用。

class Person(models.Model):
    person_id    = models.IntegerField() # not pk
    office       = models.ForeignKey(Office)

class Appointment(models.Model):
    appointment_id    = models.IntegerField() # not pk
    office            = models.ForeignKey(Office)
    person            = models.ForeignKey(Person)

class Office(models.Model):
    # mystuff here

【问题讨论】:

  • 你的最终目标是什么?您想限制创建Appointment 的人来自另一个办公室而不是约会中的人?那么想想如果有人换了办公室会发生什么?我相信你不想改变过去的任命办公室。如果您不想跟踪约会的地点,那么您可以从中删除办公室 FK,您有这个人,所以您有约会的办公室?或者您想进行查询,仅过滤将在人员办公室中的约会?

标签: python mysql django database-design sqlalchemy


【解决方案1】:

为什么在 Person 模型中使用 person_id 和 pk 而在 Office 模型中使用 pk 和 office_id?我会这样做的方式:

class Office(models.Model):
    # office stuff here

class Person(models.Model):
    office = models.ForeignKey(Office)

class Apointment(models.Model):
    person = models.ForeignKey(Person)
    office = models.ForeignKey(Office)

由于 django 为每个模型自动生成 pk,我看不出添加这些 _id 字段的理由。

【讨论】:

  • 感谢您的回复-您是对的。这是我画的一个错误,你提到的方式就是我的方式..画更新了。
  • 嗯,我认为您只需在约会类中将字段 person 更改为: person = models.ForeignKey(Person, to_field='person_id') 我从未使用过,但我在这里找到了它:docs.djangoproject.com/en/1.7/_modules/django/db/models/fields/…你引用的unique_together只是在两个字段之间做一个UNIQUE KEY。
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2021-10-31
  • 2017-06-01
  • 1970-01-01
  • 2015-01-29
  • 2012-01-12
相关资源
最近更新 更多