【问题标题】:Django Two Model Fields, same DB ColumnDjango 两个模型字段,相同的数据库列
【发布时间】:2016-11-10 06:09:31
【问题描述】:

我们正在尝试使用在 Django 之外生成且结构不理想的遗留数据库表。我们也不能修改现有的表。

数据库在所有表中使用相同的用户 ID (pk),无论是否存在该用户 ID 的记录。它还使用该 ID 作为其他表的 PK,而不是依赖它们自动增加自己的 ID。

所以想象下面这样的事情:

class Items(models.Model):
    user_id = models.ForeignKey('User', db_column='UserID')

class User(models.Model):
    user_id = models.IntegerField(primary_key=True)

class UserTypeA(models.Model):
    user_id = models.IntegerField(primary_key=True) # Same Value as User

class UserTypeB(models.Model):
    user_id = models.IntegerField(primary_key=True) # Same Value as User

我们在 Items 和 UserTypeA(以及 UserTypeB)之间创建关系的想法是创建另一个使用与 user_id 相同的列的字段条目。

class Items(models.Model):
    user_id = models.ForeignKey('User', db_column='UserID')
    user_type_a = models.ForeignKey('UserTypeA', db_column='UserID')
    user_type_b = models.ForeignKey('UserTypeB', db_column='UserID')

不幸的是,这会返回“db_column is already used”类型错误。

关于如何更好地实现我们正在尝试做的事情的任何想法?

需要注意的一个细节是,我们只从这个数据库中读取(没有更新),所以只读解决方案很好。

谢谢, -RB

【问题讨论】:

  • 我有点困惑:您的 Items 表中有相同的字段(UserID)指向两个不同的表(UserTypeA,UserTypeB)?如果是这样,您如何判断 Items 表中的特定条目指向哪个表?
  • 它们在三个用户数据库中都使用相同的 ID 号,并且仅在“用户”模型上自动递增。例如,User 中的 ID=300 也将是 UserTypeA 中的 ID=300 和 UserTypeB 中的 ID=300(假设这些表中的任何一个表中都存在记录)。如果他们在每个“UserType”表中设计了具有唯一 PK 的数据,这会更容易。
  • 嗯,我不确定这实际上是一个错误——你说的是系统检查models.E007吗?你可以试试silencing 看看它是否有效......
  • 拥有 UserTypeA 和 UserTypeB 是否有令人信服的理由?你不能用一张桌子,里面有一个标志吗?
  • 如果值总是相同的,为什么要创建几个字段?

标签: python mysql django django-models


【解决方案1】:

我已经解决了一个类似的问题(这段代码应该放在你的模型定义之前):

from django.db.models.signals import class_prepared

def remove_field(sender, **kwargs):
    if sender.__name__ == "MyModel":
        sender._meta.local_fields.remove(sender.myFKField.field)

class_prepared.connect(remove_field)

在 Django 1.5.11 中测试

Django 使用 local_fields 进行 CREATE TABLE 查询。

所以,我刚刚附加了信号 class_prepared 并检查 sender 是否等于我期望的类。如果是这样,我已经从该列表中删除了该字段。

这样做之后,CREATE TABLE 查询没有包含具有相同 db_column 的字段,并且错误没有发生。

但是模型仍然正常工作(使用管理器方法正确填充从 local_fields 中删除的字段),我无法说出它的真正影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2021-10-15
    • 2011-08-05
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多