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

ユーザーが別のオプションを選択したときにすべてdefaultを設定したいと思います。どうすればこれを達成できますか?FalseStatusdefault

編集:

Statusユーザーは自分のプロジェクトのカスタムを作成できるようになります。したがって、ユーザーが2つのプロジェクトを取得したとしましょう。これらはAudiBMWと呼ばれます。

ここで、ユーザーはのを作成しStatusますIssue。その名前はになり、彼はそれをBMW内のopenすべてのデフォルトとして選択します。プロジェクトBMW内のすべての問題は、デフォルトのステータスになります。素晴らしい!IssuesProject open

ここで、ユーザーはの別のものStatusを作成しIssueます。今回は名前がになり、彼はそれをすべてのプロジェクトのnewデフォルトとして選択します。

したがって、私が必要としているのは、 BMWopen内の最初のステータスをに設定するもの(可能な限りクエリを少なくする)です。default = false

4

2 に答える 2

1

ForeignKey Status次の関係を持つ単一インスタンスの設定モデルを作成できます。

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

インスタンスが1つだけであることを強制したい場合があり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 に答える