29
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 ' in ' field list'」)

ビューに表示される主キーはありません。回避策はありますか?

コメント:
Django でアクセスしているビューを制御できません。MySQL ブラウザーには列が表示されますが、主キーは表示されません。

4

4 に答える 4

25

「Django でアクセスしているビューを制御できない」と言うとき。MySQL ブラウザーには列が表示されますが、主キーは表示されません。

これは従来のテーブルであり、列の追加や変更が許可されていないということですか?

もしそうで、実際に主キーが存在しない場合 (文字列や int 以外の列でも*)、テーブルが適切に設定されておらず、パフォーマンスが悪くなる可能性があります。

それはあなたには関係ありません。必要なのは、すべての行で一意であることが保証されている列だけです。モデルで 'primary_key = True に設定すると、Django は満足します。

  • 問題になる可能性がもう 1 つあります。一意であることが保証されている列がない場合、テーブルは複合主キーを使用している可能性があります。つまり、2 つの列を組み合わせて一意の主キーを提供することを指定しています。これは完全に有効なリレーショナル モデリングですが、残念ながら Django ではサポートされていません。その場合、別の列を追加できない限り、生の SQL 以外に多くのことを行うことはできません。
于 2009-03-04T10:50:30.487 に答える
17

私はいつもこの問題を抱えています。変更できない、または変更したくないビューがありますが、複合情報を表示するページが必要です (おそらく管理セクションにあります)。保存をオーバーライドして、NotImplementedError を発生させるだけです。

    def save(self, **kwargs):
        raise NotImplementedError()

(これはおそらくほとんどの場合必要ありませんが、少し気分が良くなります)

また、Meta クラスで managed を False に設定しました。

    class Meta:
       managed = False

次に、任意のフィールドを選択して、主キーとしてタグ付けします。ページに情報を表示するためのフィルターなどを行っているだけで、本当にユニークかどうかは問題ではありません。

私にとってはうまくいくようです。私が見落としているこの手法に問題がある場合は、コメントしてください。

于 2012-07-21T18:48:37.020 に答える
3

ビューに主キーが実際にない場合、回避策はありません。

Djangoでは、各モデルに1つのフィールドが必要primary_key=Trueです。

于 2009-03-03T11:51:13.377 に答える
1

id実行時に自動生成されたフィールドがあったはずですsyncdb(モデルに主キーが定義されていない場合、Django は自動的に を挿入AutoFieldします)。

このエラーは、Django がデータベースにidフィールドを要求しているが、何も存在しないことを意味します。実行django manage.py dbshellDESCRIBE read_only_view;て結果を投稿できますか? これにより、データベースにあるすべての列が表示されます。

または、除外したモデル定義を含めることはできますか? (そして、実行してからモデル定義を変更していないことを確認しますsyncdbか?)

于 2009-03-03T11:40:18.003 に答える