0

私はモデルを持っています(単純化された例):

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 がないため、明らかに保存は実行されません。そのような状況をどのように処理しますか?人をタスクに追加する直前に保存してから再度保存しようとしましたが、うまくいきませんでした。

よろしく
クリス

4

2 に答える 2

1

これが私がそれを行う方法です。タスクごとに個別のグループを作成し、必要に応じて各グループを別のグループで初期化します。

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()

これで、サブグループを再利用できるようになりました。さらに、parent_group が null かどうかを確認することで、経理および営業と「経理チーム 3」などの「基本グループ」が何であるかを判断できます。ただし、ほとんどの場合、「人のリスト」を 2 か所で複製することはありません。

于 2009-01-09T23:32:50.983 に答える
0

これは、save のオーバーライドを含まない例です。あなたがしていることよりも簡単に見えます。

于 2009-01-09T12:18:55.027 に答える