繁体   English   中英

Django两个模型字段,同一数据库列

[英]Django Two Model Fields, same DB Column

我们正在尝试使用在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已经被使用”类型的错误。

是否有关于如何更好地采用我们正在尝试的方式的想法?

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

谢谢-RB

我已经解决了类似的问题(此代码应放在模型的定义之前):

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中移除的字段),我无法得知其真正的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM