繁体   English   中英

Django外键作为复合主键

[英]Django foreign keys as composite primary key

我目前正在将django与MySQL配合使用,并在使用“ inspectdb”命令创建我的models.py文件后遇到了问题。

DDL首先:

CREATE TABLE YDB_Collects (
COriginal_Data_Type_ID VARCHAR(16) NOT NULL,
CTask_Name VARCHAR(16) NOT NULL,
PRIMARY KEY (COriginal_Data_Type_ID, CTask_Name),
INDEX FK_COLLECTS_TASK (CTask_Name),
CONSTRAINT FK_COLLECTS_ORIGINAL_DATA_TYPE FOREIGN KEY (COriginal_Data_Type_ID) REFERENCES YDB_Original_Data_Type (Original_Data_Type_ID),
CONSTRAINT FK_COLLECTS_TASK FOREIGN KEY (CTask_Name) REFERENCES YDB_Task (Task_Name)
)

如您所见, COriginal_Data_Type_IDCTask_Name是外键,并且两者都是复合主键。

此DDL之后,django的“ inspectdb”命令给出了以下模型:

class YdbCollects(models.Model):
    coriginal_data_type = models.ForeignKey('YdbOriginalDataType', db_column='COriginal_Data_Type_ID')  # Field name made lowercase.
    ctask_name = models.ForeignKey('YdbTask', db_column='CTask_Name')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'ydb_collects'
        unique_together = (('COriginal_Data_Type_ID', 'CTask_Name'),)

然后,当我运行“ makemigrations”命令时,它给我错误消息:“唯一在一起引用了不存在的字段“ COriginal_Data_Type_ID”和“ CTask_Name”。

当我改变

 unique_together = (('COriginal_Data_Type_ID', 'CTask_Name'),)

unique_together = (('coriginal_data_type ', 'ctask_name'),)

那么,是的,但是这是正确的方法吗? 似乎下面的代码与我的DDL具有不同的架构...我定义的原始外键是数据类型的ID,而不是数据类型本身。

我在这里做错了吗? 我的COriginal_Data_Type_ID字段和CTask_Name字段在哪里?

好的,感谢knbk和django dev的回答是的,这是django的bug,这里有一个bug修复代码:

https://raw.githubusercontent.com/jbzdak/django/ticket_251274/django/core/management/commands/inspectdb.py

您可以下载此文件并覆盖以下文件中的inspectdb.py文件:

C:\\ Python27 \\ LIB \\站点包\\ Django的\\核心\\管理\\命令

暂无
暂无

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

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