交易结束时的Django validate_unique

时间:2018-10-30 19:05:43

标签: django postgresql django-models

我有一个模特:

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的头寸?
我心中有一个解决方案,但我实际上并不喜欢它。我可以先将位置设置为负值,然后保存,然后再设置实际的正值。

0 个答案:

没有答案