Привет всем!
Использую Django Signals (1.11.7) для некоторых действий над только что сохранённой моделью (отправка письма на почту с инфой из модели, в основном). Всё отлично, работает (ещё бы не работало :D ). Но только я добавляю к этой модели ещё одну, связанную (ForeignKey) с основной (как
inlines=[...] в admin.py) — она, как будто бы, не участвует в сохранении инстанса основной модели.
То есть, для доступа к inline модели и какого-то действия при post_save сигнале — нужно редактировать только что созданную запись + ещё раз сохранять.
Вот мой код:
# /tours/models.py
class Tours(models.Model):
country = models.CharField(...)
...
class ToursHotels(models.Model):
tour = models.ForeignKey(Tours, ...)
cost = models.IntegerField(...)
...
# Signal
@receiver(post_save, sender=Tours)
def do_something(sender, **kwargs):
tour = Tours.objects.get(id=kwargs.get('instance').id)
hotels = ToursHotels.objects.filter(tour_id=kwargs.get('instance').id).order_by('cost')
...
Так вот,
hotels
будет пустым, пока я снова не отредактирую эту запись..
И тут сразу же вопрос — как лучше сделать? Мне приходит в голову только: попробовать сделать через Celery задание, которое будет происходить уже после
post_save (что логично, ведь вначале произойдёт
post_save, а потом только
task из очереди), когда и
Tours и
ToursHotels уже есть в БД. Но это ещё одна надстройка, ради которой нужно Redis/RMQ поднимать..
Может быть есть какие-либо
best practice на эту тему? На SO встретил много вопросов без ответа на похожие темы с
post_save, но все они 2010-2012 года и свежее нет — может быть уже всё поменялось, а я и не знаю? ;)
Буду рад толковым комментариям! Заранее спасибо.