質問

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

その後、任意のフィールドを選択し、それを主キーとしてタグ付けします。ページ上に情報を表示するためのフィルターを実行するだけで本当にユニークなものであるかどうかは関係ありません。

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

ビューに本当にプライマリキーがない場合、回避策はありません。

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

自動生成されたものがあったはずです id 走ったときのフィールド syncdb (モデルに主キーが定義されていない場合、Django は AutoField あなたのために)。

このエラーは、Django がデータベースに id フィールドがありますが、何も存在しません。走れますか django manage.py dbshell その後 DESCRIBE read_only_view; そして結果を投稿しますか?これにより、データベース内のすべての列が表示されます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top