状況: 既存の mysql データベースにいくつかのデータが含まれています。この例では、2 つのフィールドのみを使用します。idとsubject。idは *auto_increment* オプション付きの整数として定義されますが、subjectは単なる通常の varchar です。コード:
モデル:
class AList(models.Model):
id=models.AutoField(primary_key=True, db_column='ID')
subject=models.CharField(max_length=200, db_column='SUBJECT')
class Meta:
db_table = u'alist'
フォーム:
class AForm(ModelForm):
class Meta:
model=AList
ビュー:
def alistForm(request,a_id=None):
if a_id:
a=AList.objects.get(id=a_id)
form=AForm(instance=a)
else:
form=AForm(request.POST or None)
return render_to_response('aform.html',{'form':form},context_instance=RequestContext(request)
def alistPost(request):
form=AForm(request.POST or None)
if form.is_valid():
form.save()
問題の説明: フォームが alistPost 関数に新しいデータを送信すると、form.save()が新しいレコードを挿入します。しかし、既存のレコードを編集すると、それも新しいレコードとして挿入され、更新されません。
id をAutoFieldからIntegerFieldに変更しようとすると、動作が変わります。レコードを変更すると、form.save()が既存のレコードを変更し、新しいレコードを挿入しようとすると、id がないために失敗します。
質問: データベースから新しい ID 値を手動で取得し、Django がこの新しいレコードにそれを使用するように強制する必要がありますか? または Django が INSERT または UPDATE を使用する必要があるかどうかを自動的に判断する方法はありますか?