2009-01-09 66 views
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) 

我要分配任務給某些羣體的人並添加誰屬於該組以及所有的人,其他的一些人稍後(或從任務中移除特定人員)。顯然,保存將不會執行,因爲當它想要添加多對多關係對象時,對象沒有標識。如何處理這種情況?在將人們添加到任務然後再次保存之前,我嘗試了保存,但那不起作用。

問候
CHRISS

回答

0

這裏是一個example不涉及覆蓋保存。它看起來比你所做的更簡單。

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

現在你可以重用你的小組,再加上你可以決定什麼是「鹼性基團」是,如會計和銷售VS「會計團隊3「,通過檢查parent_group是否爲空。不過,大多數情況下,你並沒有在兩個地方複製「人員名單」。