ForeignKeyはオブジェクトの代入でも登録できます。
今日Djangoで物を作っているときに参考にしたところ
リレーションオブジェクトリファレンス — Django v1.0 documentation
クエリを生成する — Django v1.0 documentation
ForeignKey や ManyToManyField の保存¶
ForeignKey フィールドの更新は、通常のフィールドへの変更と同じです。すな わち、適切な型のオブジェクトを代入して保存すると、フィールドの値を更新でき ます:
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()
ManyToManyField の更新は少し違います。リレーションにレコードを一つ追加 したい場合は add() メソッドを使います:
>> joe = Author.objects.create(name="Joe")
>> entry.authors.add(joe)
間違った型のオブジェクトを外部キーに代入したり add() したりすると Django はエラーを出します。
結構躓いた
こんな感じのものがある
class UserAddTags (models.Model): user = models.ForeignKey(User) tags = models.ManyToManyField(Tags) res = models.ForeignKey(Res) datetime = models.DateTimeField("useraddtag_datetime")
こんなときに、これらにすべてにリレーションを登録するときはどうするか。
今までは、create()やadd()を使っていました。実際tagsはManyToManyの関係なのでそれでいけますが、userとresはどうやって登録するの?
上の引用から、オブジェクトの作成で、代入しても良いらしいです。
よって、これに全部登録するときはこんな感じでリレーションの定義が出来ました。
#resとかtagsとかは想定のもの r1 = Res.objects.get(id=1) user1 = User.objects.get(id=2) #views.pyならrequest.userで取得しても良いはず tags = Tags.objects.filter(keyword="test") uat = UserAddTags(datetime=datenow,) uat.res = r1 uat.user = user1 uat.save() #ManyToManyなどで複数のオブジェクトの登録は #add()を繰り返しでまわす for i in tags: uat.tags.add(i)
おまけ
ちなみに、オブジェクトの登録ではなくて、id(user_id, res_id)を代入しても登録できましたが
これはありなんでしょうかね・・・
r1 = Res.objects.get(id=1) user1 = User.objects.get(id=2) #views.pyならrequest.userで取得しても良いはず tags = Tags.objects.filter(keyword="test" uat = UserAddTags(datetime=datenow, res_id = res_detail.id, user_id = user1.id, ) uat.save() #ManyToManyなどで複数のオブジェクトの登録は #add()を繰り返しでまわす for i in tags: uat.tags.add(i)