1

私のdjangoプロジェクトで2番目のデータベースとして使用したいレガシーデータベースがあります。データベースを設定ファイルに追加して、次を実行しました。

python manage.py inspectdb --database=images

スクリプトは 1 秒もかからずに終了し、その結果は驚くべきものでした。それは私のすべてのテーブルを理解しました-または最初はそう思いました。実行しようとしたとき:

python manage.py migrate --database=images

次のようなエラーが発生しました。

'unique_together' refers to the non-existent field 'commentaryId'.

エラーが発生したすべてのテーブルは、2 つの id フィールドを含む多対多のリンク テーブルであり、それらが一緒になって主キーを形成していました (したがって、一緒に「一意」である必要がありました)。

これは、このエラーを発生させた、inspectdb によって作成されたモデルの 1 つです。

class Pagescanannotationscommentaries(models.Model):
    pagescanannotationid = models.IntegerField(db_column='pageScanAnnotationId')  # Field name made lowercase.
    commentaryid = models.IntegerField(db_column='commentaryId')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'PageScanAnnotationsCommentaries'
        unique_together = (('pageScanAnnotationId', 'commentaryId'),)

スタックオーバーフローで私のような質問をいくつか見つけましたが、提案は役に立たなかったか、明らかに関係がありませんでした。しかし、それを修正するヒントを提供してくれたGoogleグループの投稿を見つけました: https://groups.google.com/forum/#!topic/django-users/_phTiifN3K0

しかし、それでも、私の問題は少し異なっていたことがわかりました。以下の回答で説明します。

4

2 に答える 2

2

これは Django 1.8 のバグでした。 #25274を参照してください。1.8.8 で修正されました。最新の 1.8.x バージョンにアップグレードする必要があります。

1.8.x から 1.8.x+1 へのマイナー バージョン アップグレードには、バグ修正とセキュリティ更新のみが含まれることに注意してください。常に最新のマイナー バージョンを使用するようにしてください。1.Y から 1.Y+1 へのメジャー バージョン アップグレードのみが、非推奨のタイムラインで概説されているように、互換性を損なう可能性があります。

于 2016-09-07T09:36:11.747 に答える
0

django の inspectdb は、私の従来のフィールド名を unique_together のフィールド名として採用しました。モデルのプロパティを使用するようにこれを変更し、問題を解決しました。上記の Google グループの投稿に記載されているように、id の前に _ も追加しました。しかし、そのアンダースコアが関連しているかどうかはわかりません。現時点では、自分のセットアップをいじりたくないので、アンダースコア付き (またはアンダースコアなし) のテストは他の人に任せています。:-) それをテストする時間があれば、見つけたものをここに投稿します。

これが私の作業モデルコードです:

class Pagescanannotationscommentaries(models.Model):
    pagescanannotation_id = models.IntegerField(db_column='pageScanAnnotationId')  # Field name made lowercase.
    commentary_id = models.IntegerField(db_column='commentaryId')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'PageScanAnnotationsCommentaries'
        unique_together = (('pagescanannotation_id', 'commentary_id'),)

この変更により、エラー メッセージが表示されなくなりました。

于 2016-09-07T09:25:31.070 に答える