我们正在尝试使用在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
答案 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中删除的字段),我无法分辨出真正的影响。