我正在使用Django(1.11.7)和Signals对新保存的模型执行某些操作(基本上使用模型中的信息向邮件发送消息)。但只有我再添加一个这个模型,连接(ForeignKey
)与main(inlines=[...]
中的admin.py
) - 它不参与保存主模型的实例。 / p>
我的模特是:
# /tours/models.py
class Tours(models.Model):
country = models.CharField(...)
...
class ToursHotels(models.Model):
tour = models.ForeignKey(Tours, ...)
cost = models.IntegerField(...)
...
@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=tour.id).order_by('cost')
...
因此,在我再次编辑此记录之前,hotels
将为空。
怎么做得更好?请帮帮我。
答案 0 :(得分:0)
因此,最佳做法是不要使用Django Signals
。特别是当有内置方法时,例如ModelAdmin.response_add,并从模型转到admin.py
:
# ./app/utils.py
def send_mail_to_admin(obj):
hotels = obj.hotels.all().order_by('cost')
message = 'Tour ID ' + obj.pk + '\n'
message += 'Country: ' + obj.country_name + ' City: ' + obj.city_name + '\n'
message += 'Hotels: \n'
for hotel in hotels:
message += hotel.name + ' ' + hotel.star + ' ' + hotel.cost + '\n'
send_mail(
'From Admin',
message,
'no-reply@example.com',
['admin@example.com'],
fail_silently=False,
)
# ./app/admin.py
from .utils import send_mail_to_admin
class ToursAdmin(admin.ModelAdmin):
exclude = ('created_at',)
list_display = ('country_name',)
ordering = ('created_at',)
inlines = (HotelsInline,)
def response_add(self, request, obj, post_url_continue=None):
send_mail_to_admin(obj)
return super().response_add(request, obj, post_url_continue)