ジャンゴ:主キーを持たない読み取り専用ビューのクエリ
-
03-07-2019 - |
質問
class dbview(models.Model):
# field definitions omitted for brevity
class Meta:
db_table = 'read_only_view'
def main(request):
result = dbview.objects.all()
レンダリング中に例外をキャッチしました:(1054、「不明な列 'read_only_view.ID'フィールドリスト'の')
がある 主キーがありません 視界に見えます。回避策はありますか?
コメント:
Django でアクセスしているビューを制御することはできません。MySQL ブラウザには列が表示されますが、主キーは表示されません。
解決
「私はDjangoでアクセスしているビューを制御できません。 MySQLブラウザには列が表示されますが、主キーは表示されません。 '
これはレガシーテーブルであり、列の追加または変更が許可されていないということですか?
もしそれが実際に主キーがない場合(文字列または非整数列*であっても)、テーブルはあまり適切に設定されておらず、パフォーマンスが低下する可能性があります。
しかし、それはあなたには関係ありません。必要なのは、行ごとに一意であることが保証されている列だけです。モデルで 'primary_key = Trueに設定すると、Djangoは満足します。
- 問題となる可能性のある他の可能性が1つあります。一意であることが保証されている列がない場合、テーブルは複合主キーを使用している可能性があります。つまり、2つの列を組み合わせて一意の主キーを提供することを指定しています。これは完全に有効なリレーショナルモデリングですが、残念ながらDjangoではサポートされていません。その場合、別の列を追加できない限り、生のSQL以外のことはほとんどできません。
他のヒント
この問題は常にあります。変更できない、または変更したくないビューがありますが、複合情報を表示するページが必要です(おそらくadminセクション)。保存をオーバーライドし、NotImplementedErrorを発生させます:
def save(self, **kwargs):
raise NotImplementedError()
(ほとんどの場合これはおそらく必要ありませんが、少し気分が良くなります)
また、MetaクラスでmanagedをFalseに設定しました。
class Meta:
managed = False
その後、任意のフィールドを選択し、それを主キーとしてタグ付けします。ページ上に情報を表示するためのフィルターを実行するだけで本当にユニークなものであるかどうかは関係ありません。
私にとってはうまくいくようです。この手法で見落としている問題がある場合は、コメントしてください。
ビューに本当にプライマリキーがない場合、回避策はありません。
自動生成されたものがあったはずです id
走ったときのフィールド syncdb
(モデルに主キーが定義されていない場合、Django は AutoField
あなたのために)。
このエラーは、Django がデータベースに id
フィールドがありますが、何も存在しません。走れますか django manage.py dbshell
その後 DESCRIBE read_only_view;
そして結果を投稿しますか?これにより、データベース内のすべての列が表示されます。
あるいは、除外したモデル定義を含めることはできますか?(そして、実行以来モデル定義を変更していないことを確認してください) syncdb
?)