2016-01-21 44 views
0

我正在使用Django 1.8。用信号连接Django模型

以下是我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),但不再是(根据文档)。我们现在怎么做?我不明白这些文件。

+0

什么不起作用?你认为“不再是”代码在django 1.9 – Sayse

+0

中是完全正确的。该代码仍然适用于当前版本,但为了使此代码正常工作,需要添加哪些附加内容? – PythonEnthusiast

+0

我不知道,你没有说过问题是什么 – Sayse

回答

0

确保您signals.py是进口的(读 “援引”)的应用程序:

yourapp/初始化的.py

import yourapp.signals 

或者,你可以使用AppConfig.ready()方法,因为它推荐在docs (section Where should this code live?)

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', 
) 

,如果你运行你的LocalServer,你应该当应用程序准备就绪时,能够从日志中看到初始化语句。如果您尚未配置LOGGING设施,则可以使用print而不是_logger.info

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