Django 更新一个中间模型的两个条目

Django update two entries of one intermediate model

我有一个简单的 Django 应用程序,用户可以在其中通过与不同的机构签订合同来关联它们。用户可以为每个研究所工作(他与之有合同)并记录他们的工作时间。

现在我想让用户定义一个 'default' 合同,当没有指定其他内容时,它将被 selected(然后将计时工作时间分配给该合同)。我可以使用以下模型来做到这一点:

class Contract(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    institute = models.ForeignKey(Institute, on_delete=models.CASCADE)
    work_hours = models.DecimalField(max_digits=4, decimal_places=1)
    default = models.BooleanField(default=False)

    class Meta:
        # We want each employee to only have one contract per institute.
        unique_together = ('user', 'institute',)

我的问题是:如何限制用户只能拥有一份默认合同?如果我有两个不同的合同,合同 A 是当前的默认合同,然后我将合同 B 更改为默认合同,我希望合同 A 的值变为 False。

我不确定我应该在模型内部还是在 ModelForm 内部处理这个问题。如果使用后者,我不确定如何创建一个包含所有可能的用户合同和无线电 select 的表单,这会更改两个条目的默认值(将旧默认值设置为 False 并将新默认为 True)。 或者我应该将其更改为完全不同的模型逻辑?

我更喜欢覆盖Model.save(),因为功夫只在默认合约的创建时完成一次

class Contract(models.Model):
    def save(self, *args, **kwargs):
        # Check if a default contract already exists
        if Contract.filter(user=self.user, default=True).exists():
            # e.g. you can set the previous default contract to be default=False
            Contract.filter(user=self.user, default=True).update(default=False)
            # or you can raise a validation error
            # raise ValidationError('A default contract already exists') 

        # else, just carry on with the save
        super(Contract, self).save(*args, **kwargs)

除了像这样完全制作一个额外的模型,我真的看不出其他方法

class DefaultContract(models.Model):
     user = models.ForeignKey(User, unique=True)
     contract = models.ForeignKey(Contract)

unique=True 将使数据库检查并强制每个用户最多 DefaultContract 个。