Сначала вам нужно отключить валидатор unique_together в сериализаторе, чтобы пройти валидацию согласно этому ответу { ссылка }
class ExampleSerializer(serializers.ModelSerializer):
def get_unique_together_validators(self):
"""Overriding method to disable unique together checks"""
return []
Затем вы можете переопределить метод update
, чтобы выполнить Ваш повторный заказ. Это оставит пробелы в порядке, хотя
def update(self, instance, validated_data):
instance.label = validated_data.get('label', instance.label)
instance.category = validated_data.get('category', instance.category)
instance.order = validated_data.get('order', instance.order)
if Item.objects.exclude(pk=instance.pk, category=instance.category, order=instance.order).exists():
# If an item already exists with the same order and category shift all
# Items up by 1 before saving
Item.objects.filter(category=instance.category, order__gte=instance.order).order_by('-order').update(order=F('order') + 1)
instance.save()
return instance
Если вы не хотите пробелов, то это становится немного сложнее, так как Item
может изменить категорию, вам нужно переместить элементы в старом категория вниз. Если предмет остается в той же категории, но его порядок увеличен, вы можете переместить все предметы между ними вниз