代码之家  ›  专栏  ›  技术社区  ›  koddr

如何在post_save实例(Django信号)中获取内联模型?

  •  0
  • koddr  · 技术社区  · 8 年前

    我正在使用Django(1.11.7)和信号对新保存的模型进行一些操作(基本上是用模型中的信息向邮件发送消息)。但只有我在这个模型中添加了一个连接( ForeignKey )主管道(as) inlines=[...] 在里面 admin.py )它不参与保存主模型的实例。

    我的模型是:

    # /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 将为空,直到我再次编辑此记录。 如何做得更好?请帮帮我。

    1 回复  |  直到 8 年前
        1
  •  0
  •   koddr    8 年前

    因此,最好的做法是不使用 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)