ManyToMany関係でオブジェクトを保存する
-
06-07-2019 - |
質問
モデルがあります(簡単な例):
class Group(models.Model):
name = models.CharField(max_length = 32)
class Person(models.Model):
group = models.ForeignKey(Group)
class Task(models.Model):
group = models.ForeignKey(Group)
people = models.ManyToManyField(Person)
def save(self, **kwargs):
ppl = Person.objects.all().filter(group = self.group)
for p in ppl:
self.people.add(p)
super(Task, self).save(**kwargs)
タスクを特定の人々のグループに割り当て、そのグループに属するすべての人々、および他の人々を後で追加したい(またはタスクから特定の人々を削除したい)。多対多のリレーションシップオブジェクトを追加する場合、オブジェクトにはIDがないため、明らかに保存は実行されません。そのような状況に対処する方法は?ユーザーをタスクに追加する直前に保存してから再度保存しようとしましたが、うまくいきませんでした。
よろしく
クリス
解決
これは例で、上書き保存は含まれません。あなたがやっていることよりも簡単に見えます。
他のヒント
これが私がやる方法です。タスクごとに個別のグループを作成し、オプションで各グループを別のグループで初期化します。
class Person(models.Model):
name = models.CharField(max_length=64)
class Group(models.Model):
name = models.CharField(max_length=32)
people = models.ManyToManyField(Person)
parent_group = models.ForeignKey(Group, null=True, blank=True)
def save(self, **kwargs):
# copy parent's people in to this group if this is a new instance and parent_group is set
if not self.id and self.parent_group:
for p in self.parent_group.people:
self.people.add(p)
super(Group, self).save(**kwargs)
class Task(models.Model):
group = models.ForeignKey(Group)
def use_case():
Group(name='empty group').save()
group = Group.objects.get(name='Accounting')
accounting_subgroup = Group(name='Accounting Copy', parent_group=group)
accounting_subgroup.people.remove(person1)
accounting_subgroup.people.remove(person2)
accounting_subgroup.save()
task = Task(group=accounting_subgroup)
task.save()
サブグループを再利用できるようになり、さらに「ベースグループ」が何であるかを決定できるようになりました。たとえば、Accounting and Salesと「Accounting team 3」のように、parent_groupがnullかどうかを確認します。ただし、ほとんどの場合、「人々のリスト」を複製するわけではありません。 2つの場所で。
所属していません StackOverflow