繁体   English   中英

如何使用唯一约束更新Django中的对象列表?

[英]How to update a list of objects in Django with a unique constraint?

我正在尝试更新具有唯一约束的对象列表,但引发了异常。 是否可以使用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

如果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()

此解决方案对我的问题无效,因为重新排列不是线性的。

例如:

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删除并创建对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM