【问题标题】:Django use Integer Field as ForeignKey fieldDjango 使用整数字段作为 ForeignKey 字段
【发布时间】:2017-01-07 07:35:36
【问题描述】:

为了支持旧的(遗留)数据库,我们必须创建一个使用 integer field 作为 foreignkey 到 User 表的表:这是我们的模型是什么样子的:

class UserHistory():
    user_id = models.IntegerField(null=True, blank=True)
    # ..... (other fields) .....

问题是用户表中可能存在也可能不存在用户 ID。有没有办法将该 user_id 字段视为用户 talbe 的外键(如果存在)?所以我可以在 django admin 或其他地方显示,而不仅仅是 ID。

【问题讨论】:

  • 你为什么不用models.ForeignKey?这些表是否位于不同的数据库中?
  • 我们必须从遗留系统中导入数据。如果我们在开始时将模型创建为外键,则当该键不存在时,它将提高外键约束。旧系统很丑:(
  • 外键也可以为空,你知道的。
  • 是的,但我在用户历史记录中发现他们有 thatid 但旧用户表中不存在该 id....导致 django 引发查询匹配不存在异常
  • db_constraint=False 参数到 ForeignKey 字段将阻止 Django 创建约束(通常是一个坏主意,但无效的旧数据意味着它可能是必要的),但你必须这样做做大量工作以使管理员工作,而不是在寻找丢失的用户时例外。

标签: python django django-models orm django-admin


【解决方案1】:

您可以将ForeignKey 字段与db_constraint=False 一起使用。有关警告,请参阅 docs,但旧的无效数据是合理的情况之一。

【讨论】:

  • 当 django admin (1.10) 命中不存在的行时,它会在外键列中显示破折号
【解决方案2】:

向您的数据库添加第二列,并使用 SQL 将另一个表中没有对应对象的字段清空。然后在这个新字段上定义您的 django 模型。

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多