2012-10-04 3 views
0

가의 모델 나는 사용자가 다른 Statusdefault 옵션을 선택하면 모든 defaultFalse에 설정하고 싶습니다사용자 고유 필드

#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 

시작하자 ManyToManyField합니다. 내가 어떻게 이걸 얻을 수 있니?

편집 : 사용자 정의 Status 자신의 프로젝트를 만들 수있을 것입니다

. 그래서, 사용자가 2 프로젝트를 가지고 있다고 가정 해 봅시다. 그들은 아우디BMW입니다.

이제 사용자는 Issue에 대해 Status을 만듭니다. 그것의 이름은 open이 될 것이고 ProjectBMW에있는 모든 Issues에 대해 기본값으로 선택합니다. 프로젝트 내의 모든 문제 BMW은 기본 상태 인 open이됩니다. 큰!

이제 사용자는 Issue에 대해 Status을 새로 만듭니다. 이번에는 이름이 new이고 그는 그의 모든 프로젝트에 기본값으로 선택합니다!

그래서 내가 원했던 것은 첫 번째 상태 인 openBMW에서 default = false까지 설정하는 것입니다 (가능한 적은 검색어로).

당신은 ForeignKeyStatus 관계 단일 인스턴스 설정 모델을 만들 수

답변

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

:

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

당신은 enforce 할 수 있습니다 하나 개의 Settings 인스턴스가되고있다.

다른 방법으로 수행 할 수있는 취소 디폴트) (다른 이름으로 저장 : 당신이 Model.save()을 무시하는 경우, 당신은 그것의 원래 동작을 다시 임명하다 할 super()을 사용하려는거야

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

주 기능. Django 문서에서 Overriding predefined model methods을 참조하십시오.

+0

설정 모델로 좋은 아이디어, 감사합니다. 그러나 비슷한 구조의 모델이 더 있기 때문에 첫 번째 초안을 유지하고 싶습니다. – Thomas

+0

또 다른 제안이 추가되었습니다. – colons

+0

여전히 프로젝트에 문제가 있습니다. 내 질문을 연장 했어, 아마 생각 났어? – Thomas