簡體   English   中英

如何在post_save實例中獲取內聯模型(Django Signals)?

[英]How to get inline model in post_save instance (Django Signals)?

我正在使用Django(1.11.7)和Signals對新保存的模型執行某些操作(基本上是將帶有模型信息的消息發送到郵件中)。 但是,只有我再添加了一個模型,並與它建立了聯系( ForeignKey )與主模型(如admin.py inlines=[...] )—它不參與保存主模型的實例。

我的模型是:

# /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將為空。 如何做得更好? 請幫幫我。

因此,最佳實踐是根本不使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM