Django: разделите один экземпляр модели на два
У меня есть модель Django Adventure с двумя полями datetime:
from django.db import models
class Adventure(models.Model):
start_time = models.DateTimeField()
end_time = models.DateTimeField()
(...)
Имеется экземпляр Adventure, допустим:
Adventure(start_time=TIME_1, end_time=TIME_2, ...)
Предполагая, что между TIME_X и TIME_1 (TIME_2) есть некоторый TIME_1 < TIME_X < TIME_2, как я могу разделить один объект Adventure на два отдельных объекта, чтобы после разделения у меня было:
#first instance
Adventure(start_time=TIME_1, end_time=TIME_X, ...)
#second instance
Adventure(start_time=TIME_X, end_time=TIME_2, ...)
Adventure имеет больше полей, которые должны быть одинаковыми для обоих экземпляров (за исключением PK, конечно).
Вы можете сделать это с помощью метода:
import copy
original_adventure = Adventure(start_time=TIME_1, end_time=TIME_2, ...)
adventure_split_1, adventure_split_2 = split_adventure(adventure, TIME_MIDDLE)
def split_adventure(adventure, middle_time):
adventure_split_1 = copy.deepcopy(adventure)
adventure_split_1.end_time = middle_time
adventure_split_2 = copy.deepcopy(adventure)
adventure_split_2.start_time = middle_time
return (adventure_split_1, adventure_split_2)
Вы можете просто использовать методы orm для изменения одного существующего объекта и создания только одного нового объекта:
# Get the first instance
adventure = Adventure.objects.get(start_time=TIME_1, end_time=TIME_2, ...)
middle_time = TIME_X
# save old end_time
old_end_time = adventure.end_time
# Modify first instance and save to DB
adventure.end_time = middle_time
adventure.save()
# Create new instance
adventure.pk = None
adventure.start_time = middle_time
adventure.end_time = old_end_time
adventure.save() # This will create a new object
В результате у вас будет две записи в базе данных с одинаковыми атрибутами, за исключением двух атрибутов start_time и end_time.