0

让我们从模型开始

#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

我想将所有设置defaultFalse当用户选择另一个选项Status时。default我怎么能做到这一点?

编辑:

用户将能够Status为他的项目创建自定义。所以,假设用户有 2 个项目——它们被称为AudiBMW

现在用户StatusIssue. 它的名字将是open,他选择它作为BMWIssues中所有的默认值。项目内的所有问题BMW将获得默认状态。伟大的!Project open

现在用户StatusIssue. 这次名称将是new,他选择它作为他所有项目的默认名称!

所以,我需要的是将BMWopen中的第一个状态设置为.default = false

4

2 回答 2

1

您可以创建具有ForeignKey Status关系的单实例设置模型:

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

您可能只想强制执行一个Settings实例。

或者,您可以在 save() 中执行取消默认设置:

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

请注意,如果您要覆盖Model.save(),您将希望使用它super()来恢复该函数的原始行为。请参阅Django 文档中的覆盖预定义模型方法

于 2012-10-04T12:35:00.260 回答
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)
于 2012-10-04T13:30:10.577 回答