Как изменить приоритет поля для модели django?
У меня есть Модель с полем приоритета типа postitive integer. Это поле уникально и позволяет мне управлять приоритетом объектов. Например, я хочу, чтобы самый важный объект имел приоритет один, второй по важности - приоритет два и т.д...
Пример:
[
{ "name": "object82",
"priority": 1
}
{ "name": "object54",
"priority": 2
}
{ "name": "object12",
"priority": 3
}
]
class MyObject(models.Model):
name = models.CharField(_("name"), max_length=255)
priority = models.PositiveSmallIntegerField(_("priority"), unique=True)
Я хочу переопределить сериализатор объектов так, чтобы при добавлении нового объекта с существующим приоритетом, он распаковывал существующие объекты. (то же самое для пути существующего объекта)
Например, если я возьму пример выше и добавлю:
{ "name": "object22",
"priority": 2
}
Я хочу получить следующий результат:
[
{ "name": "object82",
"priority": 1 // the priority didn't changed
}
{ "name": "object22", // my new object
"priority": 2
}
{ "name": "object54",
"priority": 3 // the priority had changed
}
{ "name": "object12", // the priority had changed
"priority": 4
}
]
Думаю, сначала нужно проверить, существует ли объект с таким же приоритетом в базе данных или нет. Если нет => я сохраняю как есть
Если да, то я должен изменить приоритет некоторых объектов перед добавлением нового объекта.
Как это сделать?
Может быть, что-то вроде:
class MyObjectSerializer(serializers.ModelSerializer):
class Meta:
model = MyObject
fields = '__all__'
def update(self, instance, validated_data):
target_priority = validated_data.get('priority')
if MyObject.objects.filter(target_priority).exists():
existing_priorities = MyObject.objects.filter(priority__gte=target_priority)
for existing_priority in existing_priorities:
existing_priority.priority += 1
existing_priority.save(update_fields=['priority'])
instance.priority = target_priority
instance.save(update_fields=['priority'])