例如,我正在使用post_save信号来触发配置文件数据的创建User。问题是,如果我User通过数据迁移创建对象,则post_save信号不会触发。
但是,如果我User通过 shell 或 创建实例UserCreationForm,一切似乎都正常工作。
我真的在文档中找不到任何可靠的东西。可以说我正在做这样的事情:
from django.db.models.signals import post_save
from django.dispatch import receiver
class Item(models.Model):
total_score = models.IntegerField()
def set_score(self):
...
class Review(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
score = models.IntegerField()
@receiver(post_save, sender=Review)
def my_handler(sender, **kwargs):
sender.item.set_score()
Run Code Online (Sandbox Code Playgroud)
我想做的是set_score()每当保存评论对象时调用项目对象。这是原子的吗?我绝对希望整个事情是原子的,因为保存评论但项目总分未更新的情况会导致错误。
如果任何其他用户喜欢或发布用户博客或帖子上的评论,我如何使用django-notifications或django-signals制作类似于用户个人资料中显示的facebook更新通知?
我在用户注册,socialauth_registered和post_save发送了2个信号.我希望socialauth_registered在post_save之前,因为它会影响post_save触发的函数.
这可能吗?(如果是,怎么样?!)
我不确定究竟什么是相关的,但我有:
from django.contrib.auth.models import User
from social_auth.signals import socialauth_registered, pre_update
from django.db.models.signals import post_save
<ALL OF MY MODELS>
def create_user_profile(sender, instance, created, **kwargs):
do some stuff
def create_social_profile(sender, user, response, details, **kwargs):
do other stuff
socialauth_registered.connect(create_social_profile, sender=None)
post_save.connect(create_user_profile, sender=User)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个项目,用于在博客的帮助下创建用户的提要/活动源.
这些是模特 -
class StreamItem(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
pub_date = models.DateTimeField(default=datetime.now)
content_object = generic.GenericForeignKey('content_type', 'object_id')
@property
def content_class(self):
return self.content_type.model
class Blog(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=300)
body = models.TextField()
pub_date = models.DateTimeField(default=datetime.now)
class Photo(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=200)
image = models.ImageField(upload_to=get_upload_file_name)
pub_date = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
这就是signals.py:
__init__.py
from django.db.models import signals
from django.contrib.contenttypes.models import ContentType
from django.dispatch import dispatcher
from blogs.models import Blog
from picture.models import Photo
from models …Run Code Online (Sandbox Code Playgroud) 我有一个关于 for 信号的使用的问题dispatch_uid。
目前,我通过简单地添加if not instance.order_reference. 我现在想知道是否dispatch_uid具有相同的功能,并且我可以删除“ if not”子句。
信号.py
def reserveditem_create_order_reference(sender, instance, **kwargs):
if not instance.order_reference:
instance.order_reference = unique_order_reference_generator()
Run Code Online (Sandbox Code Playgroud)
应用程序.py
class OrdersConfig(AppConfig):
name = 'orders'
def ready(self):
#Pre save signal for ReservedItem model
reserved_model = self.get_model('ReservedItem')
pre_save.connect(
reserveditem_create_order_reference,
sender=reserved_model,
dispatch_uid="my_unique_identifier"
)
Run Code Online (Sandbox Code Playgroud) 我有一个AppConfig.ready()实现,具体取决于其他应用程序的准备情况。
在调用所有应用程序ready()方法之后,是否有信号或方法(可以实现)被调用?
我知道django按照INSTALLED_APPS的顺序处理信号。
但是我不想强制执行INSTALLED_APPS的特定顺序。
例:
INSTALLED_APPS=[
'app_a',
'app_b',
...]
Run Code Online (Sandbox Code Playgroud)
处理“ app_b”后,“ app_a”如何接收信号(或方法调用)AppConfig.ready()?
(重新排序INSTALLED_APPS不是解决方案)
我的 django 应用程序中有一个信号,我想检查模型中的某个字段是否已更新,以便我可以继续做一些事情。
我的模型看起来像这样......
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.PositiveIntegerField()
tax_rate = models.PositiveIntegerField()
display_price = models.PositiveInteger()
inputed_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
Run Code Online (Sandbox Code Playgroud)
我的信号是这样的...
@receiver(post_save, sender=Product)
def update_model(sender, **kwargs):
instance = kwargs['instance']
if 'tax_rate' in kwargs['update_fields']:
# do something
Run Code Online (Sandbox Code Playgroud)
这将返回错误None不是可迭代的。我已经阅读了关于 django 信号的文档update_fields,它说The set of fields to update as passed to Model.save(), or None if update_fields wasn’t passed to save().
我应该提到我在 django admin 中工作,所以我希望发生的是,我可以在 django admin 中创建我的 Product 模型的实例,然后如果 …
我在我的项目中做了以下信号:
@receiver(pre_save, sender=group1)
@disable_for_loaddata
def total_closing_group1(sender,instance,*args,**kwargs):
total_group_closing_deb_po = instance.master_group.filter(ledgergroups__Closing_balance__gte=0,balance_nature='Debit').aggregate(the_sum=Coalesce(Sum('ledgergroups__Closing_balance'), Value(0)))['the_sum']
total_group_closing_deb_neg = instance.master_group.filter(ledgergroups__Closing_balance__lt=0,balance_nature='Debit').aggregate(the_sum=Coalesce(Sum('ledgergroups__Closing_balance'), Value(0)))['the_sum']
total_group_closing_po_cre = instance.master_group.filter(ledgergroups__Closing_balance__gte=0,balance_nature='Credit').aggregate(the_sum=Coalesce(Sum('ledgergroups__Closing_balance'), Value(0)))['the_sum']
total_group_closing_neg_cre = instance.master_group.filter(ledgergroups__Closing_balance__lt=0,balance_nature='Credit').aggregate(the_sum=Coalesce(Sum('ledgergroups__Closing_balance'), Value(0)))['the_sum']
total_closing_deb_po = instance.ledgergroups.filter(Closing_balance__gte=0,group1_Name__balance_nature='Debit').aggregate(the_sum=Coalesce(Sum('Closing_balance'), Value(0)))['the_sum']
total_closing_deb_ne = instance.ledgergroups.filter(Closing_balance__lt=0,group1_Name__balance_nature='Debit').aggregate(the_sum=Coalesce(Sum('Closing_balance'), Value(0)))['the_sum']
total_closing_cre_po = instance.ledgergroups.filter(Closing_balance__gte=0,group1_Name__balance_nature='Credit').aggregate(the_sum=Coalesce(Sum('Closing_balance'), Value(0)))['the_sum']
total_closing_cre_ne = instance.ledgergroups.filter(Closing_balance__lt=0,group1_Name__balance_nature='Credit').aggregate(the_sum=Coalesce(Sum('Closing_balance'), Value(0)))['the_sum']
if total_group_closing_deb_po != None and total_group_closing_neg_cre != None and total_closing_deb_po != None and total_closing_cre_ne != None:
instance.positive_closing = total_group_closing_deb_po + abs(total_group_closing_neg_cre) + total_closing_deb_po + abs(total_closing_cre_ne)
if total_group_closing_po_cre != None and total_group_closing_deb_neg != None and total_closing_cre_po != None and total_closing_deb_ne != None:
instance.negative_closing …Run Code Online (Sandbox Code Playgroud) 我个人喜欢使用信号:
from django.db import models
from django.db.models.signals import pre_save
class MyModel(models.Model):
...
def custom_action_before_saving(sender, instance, *args, **kwargs):
...
pre_save.connect(custom_action_before_saving, sender=MyModel)
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一些时间或任务更好地覆盖模型类中的save方法:
from django.db import models
class MyModel(models.Model):
...
def save(self):
...
super(MyModel, self).save()
Run Code Online (Sandbox Code Playgroud)
我问这个是因为save()在Django的Documentation页面中有一个覆盖方法(上面提供的链接)的例子,所以我不认为这是一个不好的做法.
我们pre_save()举个例子,文档说:
这是在模型的save()方法的开头发送的.
这是否意味着覆盖save对使用信号的性能具有相同的影响?