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
个。
我有一个简单的 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
个。