2013-10-27 117 views
0

我有一个由doctrine/symfony1.4生成的mysql数据库,我需要一个单独的django 1.4项目来引用同一个mysql数据库上的现有表。数据库由许多面向客户端的用户界面共享,无法进行迁移或复制,symfony和django都需要引用/更新同一数据库上的相同表,以便面向客户端的UI同步。不幸的是,doctrine在那里,并且在这些表之间创建了约束名称和索引名称,我找不到如何强制django使用相同的名称。当我尝试在django对象中包装这些现有表时,这会导致崩溃。Django:更改外键约束名称

任何想法如何覆盖或强制django 1.4模型使用特定的外键约束名称以及索引?

更新:增加有关表设置和崩溃的详细信息

主义模式:

Feature: 
    actAs: [Timestampable] 
    columns: 
     name: { type: string(100) } 
     description: { type: string(200) } 
     pivotXpos: { type: float, notnull: true } 
     pivotYpos: { type: float, notnull: true } 
     referenceImageUrl: { type: string(200), notnull: true } 
     referenceThumbnailImageUrl: { type: string(200), notnull: true } 
     bbox_minx: { type: float, notnull: true } 
     bbox_miny: { type: float, notnull: true } 
     bbox_maxx: { type: float, notnull: true } 
     bbox_maxy: { type: float, notnull: true } 
    relations: 
     Curve: 
     local: id 
     foreign: feature_id 
     cascade: [delete] 
     type: many 


Curve: 
    actAs: [Timestampable] 
    columns: 
     name: { type: string(100), notnull:true} 
     feature_id: { type: bigint, notnull: true } 
    relations: 
     Feature: { onDelete: CASCADE, local: feature_id, foreign: id, 
       foreignAlias: Curves } 

表SQL

CREATE TABLE feature (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100), description VARCHAR(200), 
pivotxpos FLOAT(18, 2) NOT NULL, 
pivotypos FLOAT(18, 2) NOT NULL, 
referenceimageurl VARCHAR(200) NOT NULL, 
referencethumbnailimageurl VARCHAR(200) NOT NULL, 
bbox_minx FLOAT(18, 2) NOT NULL, 
bbox_miny FLOAT(18, 2) NOT NULL, 
bbox_maxx FLOAT(18, 2) NOT NULL, 
bbox_maxy FLOAT(18, 2) NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
PRIMARY KEY(id)) ENGINE = INNODB; 

CREATE TABLE curve (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100) NOT NULL, 
feature_id bigint NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
INDEX feature_id_idx (feature_id), 
PRIMARY KEY(id)) ENGINE = INNODB; 

ALTER TABLE curve ADD CONSTRAINT curve_feature_id_feature_id 
FOREIGN KEY (feature_id) REFERENCES feature(id) ON DELETE CASCADE; 

的Django类:

class Feature(models.Model): 

    class Meta: 
     db_table = 'feature' 

    name = models.CharField(max_length=100) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    description = models.CharField(max_length=100) 
    pivotXpos = models.FloatField() 
    pivotYpos = models.FloatField() 
    pivotXpos = models.FloatField() 
    referenceImageUrl = models.CharField(max_length=200) 
    referenceThumbnailImageUrl = models.CharField(max_length=200) 
    bbox_minx = models.FloatField() 
    bbox_miny = models.FloatField() 
    bbox_maxx = models.FloatField() 
    bbox_maxy = models.FloatField() 

    def __unicode__(self): 
     return self.name; 


class Curve(models.Model): 

    class Meta: 
     db_table = 'curve' 

    name = models.CharField(max_length=100) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    feature_id = models.ForeignKey(Feature) 

    def __unicode__(self): 
     return self.name; 

崩溃(Django的外壳内)

>>> Curve.objects.all() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 72, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 87, in __len__ 
    self._result_cache.extend(self._iter) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql 
    cursor.execute(sql, params) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/util.py", line 40, in execute 
    return self.cursor.execute(sql, params) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 114, in execute 
    return self.cursor.execute(query, args) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
DatabaseError: (1054, "Unknown column 'curve.feature_id_id' in 'field list'") 
+0

什么是“崩溃”的确切性质?我不清楚为什么不同的索引名称和约束名称会影响Django ORM。 –

回答

0

有关约束/索引名不知道,但我可以用在ForeignKeyField

的“db_column”字段选项来解决这个问题
feature_id = models.ForeignKey(Feature,db_column='feature_id') 
1

这是错误: (1054, “未知列在 '字段列表' curve.feature_id_id'”) 所以,如果你不想指定db_column作为user257543设, 你可以写,而不是

feature = models.ForeignKey(Feature) 

这是更清洁