2012-10-04 90 views
0

讓我們開始與模型定製獨特的領域,以ManyToManyField

#models.py 
class Project(models.Model): 
    owner = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 

class Issue(models.Model): 
    project = models.ForeignKey(Project) 
    title = models.CharField(max_length=100) 
    status = models.ForeignKey('Status') 


class Status(models.Model): 
    name= models.CharField(max_length=10, help_text=u'eg open, closed...') 
    default = models.BooleanField(default=False) 
    project = models.ManyToManyField(Project) 

    def save(self, *args, **kwargs): 
     if self.default: 
      #self.__class__.objects.filter(default=True, project=self.project).update(default=False) 
      pass 

我想,當用戶選擇的另一Statusdefault選項來設置所有defaultFalse。我怎麼能做到這一點?

編輯:

的用戶將能夠創建爲他的項目定製Status。因此,假設用戶有2個項目 - 他們被稱爲奧迪寶馬

現在用戶爲Issue創建Status。它的名字將是open,並且他選擇它在ProjectBMW內的所有Issues的默認值。 項目內所有問題寶馬將獲得默認狀態open。大!

現在用戶爲Issue創建另一個Status。這一次的名字將是new,並且他將其選爲默認他所有的項目

所以,我需要的是設定第一狀態open寶馬default = false東西(如用更少的查詢越好)。

回答

1
def save(self, *args, **kwargs): 
     if self.default: 
      for status in Status.objects.filter(default=True,project__in=self.project.all()): 
       status.default=False 
       status.save() 
     super(Status,self).save(*args,**kwargs) 
1

您可以創建一個ForeignKeyStatus關係的單一實例設置模式:

class Settings(models.Model): 
    default_status = models.ForeignKey('Status') 

您可能希望enforce只存在一個被實例Settings

或者,您可以執行未違約的保存():

if self.default: 
    for status in self.__class__.objects.all(): 
     if status != self: 
      status.default = False 
      status.save() 

請注意,如果要覆蓋Model.save(),你需要使用super()申請復權的原始行爲功能。請參閱Django文檔中的Overriding predefined model methods

+0

一個設置模型的好主意,謝謝。但我很想保留我的初稿,因爲還有更多的模型具有相似的結構。 – Thomas

+0

已增加另一個建議。 – colons

+0

仍然有項目的問題。我已經提出了我的問題,也許你有一個想法? – Thomas