标签: django-signals

Django post_save 信号未从数据迁移中触发

例如,我正在使用post_save信号来触发配置文件数据的创建User。问题是,如果我User通过数据迁移创建对象,则post_save信号不会触发。

但是,如果我User通过 shell 或 创建实例UserCreationForm,一切似乎都正常工作。

django django-signals

8
推荐指数
0
解决办法
1784
查看次数

Django 中的 post_save 信号是原子的吗?

我真的在文档中找不到任何可靠的东西。可以说我正在做这样的事情:

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 django-signals

8
推荐指数
1
解决办法
2110
查看次数

Facebook喜欢使用django信号或通知的通知更新

如果任何其他用户喜欢或发布用户博客或帖子上的评论,我如何使用django-notifications或django-signals制作类似于用户个人资料中显示的facebook更新通知?

django django-signals django-notification

7
推荐指数
1
解决办法
5196
查看次数

可以改变Django信号的顺序吗?

我在用户注册,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)

django signals django-signals

7
推荐指数
2
解决办法
2899
查看次数

django信号没有按预期工作

我正在尝试创建一个项目,用于在博客的帮助下创建用户的提要/活动源.

这些是模特 -

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)

django django-signals

7
推荐指数
1
解决办法
2688
查看次数

Django 信号dispatch_uid

我有一个关于 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)

django django-signals

7
推荐指数
1
解决办法
5339
查看次数

Django:在“ AppConfig.ready()”之后调用的Signal / Method

我有一个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 django-signals django-apps

7
推荐指数
1
解决办法
604
查看次数

Django 信号 - kwargs['update_fields'] 在通过 django admin 进行模型更新时始终为 None

我的 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 模型的实例,然后如果 …

django django-signals django-admin

7
推荐指数
2
解决办法
9049
查看次数

Django 错误:[&lt;class 'decimal.InvalidOperation'&gt;]

我在我的项目中做了以下信号:

@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)

django django-signals django-models

7
推荐指数
2
解决办法
7185
查看次数

Django - 我应该何时使用信号,何时应该覆盖保存方法?

我个人喜欢使用信号:

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对使用信号的性能具有相同的影响?

django django-signals django-models

6
推荐指数
1
解决办法
1480
查看次数