我有一个模特:
class BikePhoto(models.Model):
photo = models.ImageField(verbose_name=_('zdjęcie'), upload_to='bikes')
bike = models.ForeignKey(Bike, on_delete=models.CASCADE, verbose_name=_('motocykl'))
position = models.IntegerField(verbose_name=_('Pozycja'), null=True)
class Meta:
unique_together = (('position', 'bike'),)
在我的数据库中有一些实例。对于特定的自行车,我们列出了3个BikePhotos,分别位于位置1,2和3。我想对其重新排序,以便我希望这三个BP分别位于位置2、1和3。
但是不幸的是,我在保存第一个BP时出错并出错(旧:1,新2)Key ("position", bike_id)=(1, 2) already exists.
这是我用来重新排序照片的代码:
def update_image_positions(request):
if request.POST:
items = request.POST.getlist('items[]')
bps = []
for position, item in enumerate(items):
bp = BikePhoto.objects.get(id=item)
bp.position = position
bps.append(bp)
[i.save() for i in bps]
return JsonResponse({'result': 1})
我也尝试过使用transaction.atomic,但是实际上它没有按我预期的那样工作,所以我删除了它。我以为它将在事务结束时检查唯一约束,但是每当我运行BP.save()时它就会检查一次。
有没有办法交换这些BP的头寸?
我心中有一个解决方案,但我实际上并不喜欢它。我可以先将位置设置为负值,然后保存,然后再设置实际的正值。