我正在尝试使用唯一约束更新对象列表,但会引发异常。 是否可以使用Django ORM推迟约束?
这就是我的尝试:
class Episode(models.Model):
issue_date = models.DateTimeField(db_index=True, unique=True)
...
def rearrange_episodes(cls, programme, after):
next_episodes = Episode.objects.filter(programme=programme, issue_date__gte=after).order_by('issue_date')
for episode in next_episodes:
episode.issue_date = get_next_date()
episode.save() #Crash -> Duplicate entry
答案 0 :(得分:1)
如果get_next_date()
返回已存在的日期,则表示您遇到无法解决的问题。
我认为你想把日期改为“一集” 即。
episode[0].issue_date --> episode[1].issue_date
episode[1].issue_date --> episode[2].issue_date
episode[2].issue_date --> new date
...您已尝试按上述方式执行,但由于episode[1].issue_date
已存在,因此在第一步失败。
要解决此问题,您只需按相反的顺序迭代即可:
episode[2].issue_date --> new date
episode[1].issue_date --> previous episode[2].issue_date
episode[0].issue_date --> previous episode[1].issue_date
假设您的get_next_date()
函数在这种情况下可以正常工作,您只需将代码更改为:
def rearrange_episodes(cls, programme, after):
next_episodes = Episode.objects.filter(programme=programme, issue_date__gte=after).order_by('-issue_date')
for episode in next_episodes:
episode.issue_date = get_next_date()
episode.save()
答案 1 :(得分:0)
此解决方案对我的问题无效,因为重新排列不是直线的。
例如:
episode[4].issue_date --> new date
episode[3].issue_date --> previous episode[4].issue_date
episode[2].issue_date --> not change
episode[1].issue_date --> previous episode[0].issue_date
episode[0].issue_date --> new date
我只看到两种简单的方法来解决问题,删除约束或删除并使用bulk_create创建对象