用信号连接Django模型

时间:2016-01-21 10:31:39

标签: python django django-models django-signals

我正在使用Django 1.8。

以下是我的signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from datetime import datetime
from models import Watch, LastUpdated


@receiver(post_save, sender=Watch)
def my_handler(sender, **kwargs):
    obj = LastUpdated.objects.all()
    current_datetime = datetime.now()
    if obj:
        obj.last_updated = current_datetime
    else:
        obj = LastUpdated(last_updated=current_datetime)
    obj.save()

我的 models.py

class LastUpdated(models.Model):
    last_updated = models.DateTimeField(auto_now=True)

class Watch(models.Model):
    brand = models.CharField(max_length=255)
    model_name = models.CharField(max_length=255)
    dial_image = models.ImageField(upload_to='watch/')
    hour_hand = models.ImageField(upload_to='watch/')
    minute_hand = models.ImageField(upload_to='watch/')
    second_hand = models.ImageField(upload_to='watch/')
    product_url = models.URLField()
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

如何将信号与模型连接?

在早期版本中,我们使用models.py文件中的post_save.connect(my_handler, sender=Watch),但不再使用(根据文档)。我们现在怎么做?我不太了解文档。

2 个答案:

答案 0 :(得分:0)

确保您的应用程序导入signals.py(读取“已调用”):

yourapp /的初始化的.py

import yourapp.signals

或者,您可以按照docs (section Where should this code live?)中的建议使用AppConfig.ready()方法。

答案 1 :(得分:0)

只是为了向您展示正确的例子。

使用类似于此的内容创建AppConfig:

# my_app/apps.py


import logging

from django.apps import AppConfig


_logger = logging.getLogger(__name__)


class AppConfig(AppConfig):
    name = "my_app"
    label = "My App"

    def ready(self):
        _logger.info("'%s' completed initialisation.", self.label)
        import my_app.signals

请记住在导入AppConfig的设置中正确注册了您的应用

# settings.py
# ...
INSTALLED_APPS = (
    # ...
    'my_app.apps.AppConfig',
)

现在,如果您运行本地服务器,您应该能够在应用程序准备就绪时从日志中看到初始化语句。如果您没有配置LOGGING工具,则可以使用print代替_logger.info

my_app/signals.py是您在问题中提到的文件。