Django多対多リレーションシップの中間モデルのインスタンスを削除するにはどうすればよいですか?
-
06-07-2019 - |
質問
例、3つのモデルがあります:
class User(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(User, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(User)
group = models.ForeignKey(Group)
date_joined = models.DateField()
メンバーの追加は機能します。しかし、単一のMembershipインスタンスを削除するにはどうすればよいですか (ユーザーはグループを終了します)、ユーザーもグループも削除せずに?
次のように削除しようとすると:
u = User(request.user)
g = Group.objects.get(id=group_id, membership__user=u)
m = Membership(user=request.user, group=g)
m.delete()
エラーが表示されます:
/ groups / quit / 1 /でのAssertionError
id属性がに設定されているため、Membershipオブジェクトを削除できません なし。
解決
行内
m = Membership(user=request.user, group=g)
データベースから取得していない新しい Membership
を作成しました。そのため、id属性がNoneに設定されています。
おそらくあなたの意図
m = Membership.objects.get(user=request.user, group=g)
他のヒント
この特定のエラーは、クラス Membership
の m
インスタンスが保存されていないため、その主キーがNoneであるという事実によってトリガーされます。どうやら、そのような未保存のインスタンスを削除することは不可能です(「削除」するものがないため、これは理にかなっています)。
所属していません StackOverflow