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.

Вернуться на верх