プロジェクトの1つにDjango1.3を使用していますが、データベースに保存したばかりのレコードのIDを取得する必要があります。
データベースにレコードを保存するために、以下のコードのようなものがあります。
n = MyData.objects.create(record_title=title, record_content=content)
n.save()
レコードのIDは、自動インクリメントを保存しました。そのIDを取得して、コード内の別の場所で使用する方法はありますか?
プロジェクトの1つにDjango1.3を使用していますが、データベースに保存したばかりのレコードのIDを取得する必要があります。
データベースにレコードを保存するために、以下のコードのようなものがあります。
n = MyData.objects.create(record_title=title, record_content=content)
n.save()
レコードのIDは、自動インクリメントを保存しました。そのIDを取得して、コード内の別の場所で使用する方法はありますか?
回答:
n.id
保存後に使用します。
「主キーの自動インクリメント」を参照してください。
n.pk
、それはあなたが主キーを自分で追加するか、または1を追加し、それのidという名前のなかった場合にのみ、IDとなりますので、。
になりますn.pk
。
「Model.pk」を引用するには:
主キーフィールドを自分で定義するか、Djangoに提供させるかに関係なく、各モデルにはpkというプロパティがあります。これはモデルの通常の属性のように動作しますが、実際には、モデルの主キーフィールドである属性のエイリアスです。他の属性の場合と同じように、この値を読み取って設定でき、モデルの正しいフィールドが更新されます。
.pk
がデフォルトIDまたはカスタムIDのいずれかを参照するため、おそらく「ベストプラクティス」と見なされることを示しています。
IDはモデル内で自動的に更新されるため、n.save()
行の直後に読み取ることができ、データn.id
が入力されます。
save()を削除し、pkを直接取得します。
n = MyData.objects.create(record_title=title, record_content=content)
n.pk
IDへのアクセスに関しても同様の問題がありました。Django 3.0.5では、これがIDへのアクセス方法です。例と変数名を使用して、以下を参照してください。
instance = n.save()
# return the id
instance[0].id
上記の変数「インスタンス」はリストです。上記のメソッドでidにアクセスすると、Django 3でAttributeError( "オブジェクトに属性 'id'"がありません)が返されます。
この回答は、を使用する場合に適用されますmodelformset_factory
。これは、Djangoのドキュメントで説明されているようにDjangoモデルからFormクラスを作成する場合に当てはまります。
誰かがこの質問を読んでいる場合、残りの回答は、オブジェクトの作成後もIDへのアクセスに問題があります。id
モデルで整数として定義しないように注意してください。Djangoでは無料なので、IDを書き込んだり使用したりすることはできませんAutofield
#No
class TestModel(models.Model):
id = models.IntegerField(primary_key=True)
something...
#Ok
class TestModel(models.Model):
id = models.AutoField(primary_key=True)
something...
#Ok
class TestModel(models.Model):
something...
id
整数として定義するTestModel.objects.create(
か、withを指定save()
すると、Noneが返されます。
n.save()
、この行は不要ですMyData.objects.create
。