Автоматическое добавление новой записи в models Django

Пытаюсь реализовать такой функционал. Есть модель Books и модель Store

class Store(models.Model):
    store_name = models.CharField(max_length=255, blank=False, null=False)
    store_address = models.CharField(max_length=255, blank=False, null=False)


class Books(models.Model):
    book_name= models.CharField(max_length=255, blank=False, null=False)
    book_stored_on = models.ForeignKey(Store, blank=False, null=False, on_delete=models.DO_NOTHING)
    book_price = models.FloatField(blank=True, null=True)

Когда создаётся новая книга, допустим на одном store, я хочу что бы она создавалась и на другом store. Но, сначала, эта книга должна быть записана на первый store и только потом создалась во втором. И при этом значение book_price для второго store менялось на противоположное значение.

def save(self, *args, **kwargs):
    # создание первой книги
    super().save(*args, **kwargs)
    
    # создание второй книги
    self.pk += 1
    if self.book_stored_on.id == 1:
        self.book_price *= -1
        self.book_stored_on.id == 2:
    elif self.book_stored_on.id == 2:
        self.book_price *= -1
        self.book_stored_on.id == 1:        
    # создание второй книги
    super().save(*args, **kwargs)
    
    # процесс выборки и отправки данных
    records = 'some data'
    return prepare_model_data(data=records)

Проблема в том, что просто создаётся ещё одна книга на первом сторе, а не на втором. А даже если и создаётся на втором (при условии, что добавлена 1 к book.pk), значение book_price и book_store не изменяется.

в последней строчку не указан return потому, что после сохранения записи в бд, происходит выборка всех значений из бд и отправление их в отдельную функцию, которая их обрабатывает для другого функционала.

Так же есть вопрос касательно id книги. Будет ли правильно, при её создании к id добавить 1, что бы она была записана, а не перезаписана ?


Ответы (1 шт):

Автор решения: MilkyWay

Всё просто. Когда вы работаете с Django пытайтесь думать объектно, иначе зачем ещё использовать фреймворк ? :) Сей час вы меняете один и тот же экземпляр книги, а вам нужно создать ещё один и записать его в БД.

Далее псевдокод, для иллюстрации логики:

if self.book_stored_on.id == 1:
    new_id = 2
elif self.book_stored_on.id == 2:
    new_id = 1
new_book = Books(
    book_name = self.book_name,
    book_stored_on = new_id,
    book_price = - self.book_price # в задаче стоит поменять цену на противоположную
) 
new_book.save()

P.S. Если вам нужно взять число по модулю используйте функцию abs()

→ Ссылка