Джанго устанавливает поля модели после создания - PullRequest
0 голосов
/ 15 января 2019

У меня есть модель Movie и Model DefaultMoviePriceFor, которая сохраняет цены по умолчанию для определенного жанра:

class Movie(models.Model):
    name = models.TextField('name', null=True)
    genre = models.TextField('genre', null=True)
    price = models.IntegerField('price', default=0)

class DefaultMoviePriceForGenre(models.Model):
    genre = models.TextField('genre', null=True)
    price = models.IntegerField('price', default=0)

Теперь я хотел бы заполнять Movie.price по умолчанию ценой Movie.genre каждый раз, когда создается экземпляр объекта Movie.

Есть ли хороший способ сделать это? У меня в голове триггеры SQL, они могут это сделать, не так ли? Как это делается в Django?

1 Ответ

0 голосов
/ 15 января 2019

Один из способов сделать это - сигнал предварительного сохранения . Он будет запущен непосредственно перед сохранением любого экземпляра модели и получит логический аргумент created, который позволит вам установить цену, только если объект новый.

Существует также сигнал после сохранения, если по какой-то причине вы хотите сделать это после сохранения, например, потому что ваше поведение зависит от PK нового экземпляра. Но предварительное сохранение должно работать здесь.

Кроме того, вы можете переопределить метод save класса модели. https://docs.djangoproject.com/en/2.1/topics/db/models/#overriding-model-methods

См. Этот ответ для некоторого обсуждения плюсов и минусов двух подходов: Сигналы Джанго против переопределенного метода сохранения

Все это при условии, что желаемое поведение в точности соответствует описанию - посмотрите текущую цену жанра по умолчанию при создании экземпляра и сохраните ее независимо от будущих изменений в жанре. Если вы хотите сделать что-то более гибкое - например, скажем «фильмы ужасов стоят X сейчас, если только они не переопределены, но если я изменю цену жанра по умолчанию позже, они все обновят», то вам лучше всего использовать метод класса Movie, который вычисляет цена основана на текущем состоянии, а не устанавливается при создании и разрыве этой связи. Но это зависит от того, что вы хотите.

...