1

を挿入しないジャンゴ。メイクは私がDjangoがDBを記入することになっているそのタイムスタンプフィールドとしてオブジェクトの作成中にfield_3挿入しないようにしたいPostgreSQLデータベーステーブルに対してDjangoのモデルを持っている特定のフィールド

class AbcModel: 
    model_id = models.AutoField(primary_key=True) 
    field_1 = models.BigIntegerField() 
    field_2 = models.TextField() 
    field_3 = models.DateTimeField(blank=True, null=True) 

    class Meta: 
    managed = False 
    db_table = 'abc_table' 

対応するテーブルスキーマ

abc_table

  • MODEL_ID INTEGER NOT NULLデフォルト
    NEXTVAL( 'command_running_command_id _seq ':: regclassデータ)
  • FIELD_1整数ではない私が試した何今の時間帯のデフォルトなしヌル
  • field_2テキストnullでない
  • field_3タイムスタンプ()

- 私は1つのモデルを呼び出す必要があることを読んで.save(update_fields = [更新するフィールドのリスト])。

class AbcModel(models.Model): 
    def save(self, *args, **kwargs): 
     u_fields = ['field_1', 'field_2'] 
     super(CommandRunning, self).save(update_fields=u_fields) 

しかし、私はupdate_fieldsにMODEL_ID含まれている場合、私は例外

Cannot force an update in save() with no primary key. 

を取得するには、私は例外

The following fields do not exist in this model or are m2m fields: model_id 

を以下の取得私はここで何をしないのですか?

+1

なぜタイムスタンプを追加するにはデータベースが必要ですか? '' '' 'field_3 = models.DateTimeField(auto_now_add = True)' ''を設定するだけで、回避策を見つける心配はありません。または私は何かを逃していますか? – tdsymonds

+0

私はデータベーススキーマを所有していません。私はそれを介して管理インターフェイスだけを提供するはずです。 Djangoは驚くべきinspectdbコマンドで自然に選択されたように見えましたが、生成するモデルファイルにはデータベースに合わせるための少しの修正が必要です。 – comiventor

答えて

1

事実:update_fieldsを指定するたびに、更新を強制的に保存します。これは、自動生成された主キーが利用できないため、挿入時に役立ちません。

最終解決:

INSERTクエリがデータベースに発射される直前に呼び出される_do_insertと呼ばれる方法があります。それを上書きして、挿入したくないフィールドを削除することができます。

def _do_insert(self, manager, using, fields, update_pk, raw): 
     return super(AbcModel, self)._do_insert(
      manager, using, 
      [f for f in fields if f.attname not in ['field_3']], 
      update_pk, raw) 

生成された挿入クエリを調べてみます。データベースに送信された挿入SQLにfield_3が存在しないことがわかります。これにより、データベースは指定されたデフォルトを使用してフィールドを挿入できます。

関連する問題