Django两个模型字段,相同的DB列

时间:2016-07-07 19:21:12

标签: python mysql django django-models

我们正在尝试使用在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

1 个答案:

答案 0 :(得分:0)

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

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,并检查寄件人是否等于我期待的班级。如果是这样,我已从该列表中删除该字段。

执行此操作后,CREATE TABLE查询不包含具有相同db_column的字段,并且错误不是ocurr。

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