标签: django-signals

Django:在queryset.update上发出信号

如果您正在使用该queryset.delete()方法,Django正在发送pre/post_delete信号,但是它不应该发送pre/post_save queryset.update()吗?

django django-signals

10
推荐指数
1
解决办法
3048
查看次数

Django:Django Admin中具有唯一外键的UserProfile

我使用名为的自定义用户配置文件扩展了Django的用户模型UserExtension.它通过一个独特的ForeignKey Relationship与User相关,这使我能够以内嵌形式在admin中编辑它!我正在使用信号为每个新用户创建一个新的配置文件:

def create_user_profile(sender, instance, created, **kwargs):  
    if created:
        try:  
            profile, created = UserExtension.objects.get_or_create(user=instance)
        except:
            pass  

post_save.connect(create_user_profile, sender=User) 
Run Code Online (Sandbox Code Playgroud)

(如此处所述:在Django中使用自定义字段扩展用户模型)问题是,如果我通过管理员创建新用户,则在保存"列user_id不唯一"时会出现IntegritiyError.似乎信号被调用两次,但我想管理员试图保存配置文件AFTERWARDS?但是如果我在系统的其他部分创建一个新用户,我需要通过信号创建!

django inline admin foreign-keys django-signals

10
推荐指数
1
解决办法
4612
查看次数

Django在芹菜中的信号

我有一个在Celerybeat实例中运行的任务.当执行该任务时,它有时会修改一个模型对象,该对象应触发post/pre_save信号,但事实并非如此.信号没有发生.我想这是因为Django的信号是同步的,而芹菜在不同的宇宙中的不同线程中的不同服务器上做这件事.是否有一种简单的方法可以让这些信号在芹菜中运行时被点燃?

django django-signals celery

10
推荐指数
1
解决办法
2526
查看次数

Django pre_save信号不起作用

我通过以下方式测试了Django的"pre_save"信号,但无法捕获其中任何一个的信号.

$

from django.db.models.signals import pre_save
import logging

def my_callback(sender, **kwargs):
    logging.debug("======================================")
pre_save.connect(my_callback)
Run Code Online (Sandbox Code Playgroud)
  1. 在manage.py shell中运行上面的代码:然后我运行我的网站并看到models.save()成功运行,但回调函数没有运行.

  2. 或者,我再次在shell上运行上面的代码,然后在shell中运行models.save()."save"再次运行良好,但回调函数仍未发生任何变化.

  3. 最后,我将上面的代码嵌入到一个__init__.py文件中,然后在网站上运行save()函数.但事实并非如此.

你能不能帮我弄清楚为什么pre_save信号看起来不起作用?

python django django-signals

10
推荐指数
1
解决办法
1万
查看次数

RemovedInDjango19Warning:Model没有声明一个明确的app_label

经历过

Django 1.9弃用警告app_label

但答案无法解决我的问题,所以再问一遍.

我有一个应用程序添加到设置中的INSTALLED_APPS.

我什么时候跑manage.py runserver,我得到这个警告,

[trimmed path to project]/catalog/models.py:9: RemovedInDjango19Warning: Model class catalog.models.Category doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Category(models.Model):
Run Code Online (Sandbox Code Playgroud)

我的应用程序的代码,

signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from models import Category

@receiver(post_save, sender=Category)
def someSignal(sender, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

apps.py

from django.apps import AppConfig

class CatalogConfig(AppConfig):
    name = 'catalog' …
Run Code Online (Sandbox Code Playgroud)

python django django-signals django-apps deprecation-warning

10
推荐指数
2
解决办法
2万
查看次数

定义自定义post_migrate信号

我正在为我的项目进行某种重构,我依赖于django django.contrib.auth.models.Permission模型.到目前为止,我使用post_save信号为每个新用户定义权限,因此在创建用户时,我使用user.user_permissions.add(the_permission)它分配权限,这非常有效.

现在我想使用该django.contrib.auth.models.Group模型来区分用户应具有的权限.

这是我的代码:

from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.contrib.auth.models import Group, Permission


def create_group(name, permissions):
    group = Group.objects.create(name=name)
    [group.permissions.add(permission) for permission in permissions]


def define_company_groups(sender, **kwargs):
    permissions = [
        Permission.objects.get(codename='add_mymodel'),
        Permission.objects.get(codename='change_mymodel'),
    ]
    create_group('managers', permissions)


class MyAppConfig(AppConfig):
    name = 'players'
    verbose_name = 'The players app'

    def ready(self):
        post_migrate.connect(define_company_groups, sender=self)
Run Code Online (Sandbox Code Playgroud)

在定义了这段代码之后,我希望在调用之后./manage.py migrate应该触发这个处理程序.但它没有发生,我得到的只是:

Running post-migrate handlers for application players
Adding permission 'players | mymodel | Can add mymodel'
Adding permission 'companies …
Run Code Online (Sandbox Code Playgroud)

django django-signals django-migrations

10
推荐指数
2
解决办法
3995
查看次数

django信号是否也包含在transaction.atomic装饰器内?

我有一个模型文件,它使用一个post_save信号在另一个表中创建一个链接的行.以典型的方式,我可以从我的一个视图创建一个页面,该视图用@ transaction.atomic修饰.

我想知道这个装饰器是否会在同一个事务中创建Page对象和SharedPage对象.从django文档中不清楚信号是这个原子事务的一部分.

models.py

class Page(models.Model):
    name = models.CharField(default='My default page',max_length=200,blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    slug = models.SlugField()
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    is_public = models.BooleanField(default=False)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

    class Meta:
        ordering = ['position','created_at']

@receiver(post_save, sender=Page)
def create_shared_page_entry(sender, instance, created, **kwargs):
    if created:
        shared_page = SharedPage.objects.create(
            page=instance,
            user=instance.user,
            can_edit=True
        )
Run Code Online (Sandbox Code Playgroud)

view.py

@require_http_methods(["POST"])
@transaction.atomic
def page_create(request):
    name = request.POST.get('name')
    page = Page.objects.create(name=name, owner=request.user)

    data = serializers.serialize("json", [page])
    return HttpResponse(data, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)

python django transactions django-signals django-models

10
推荐指数
1
解决办法
2447
查看次数

django m2m_changed与自定义模型

在Django中,我确实有两个模型"作者"和"出版物",它们与多对多字段相关联,因此我可以将不同的作者分配给出版物.此外,我必须使用自定义直通模型"作者"来定义正确的顺序.

class Author(models.Model):
    first_name = models.CharField(max_length=48)
    .....


class Authorship(models.Model):
    author = models.ForeignKey(Author)
    publication = models.ForeignKey('Publication')
    order_of_authorship = models.IntegerField(default=1)


class Publication(models.Model):
    title = models.CharField(max_length=128)
    authors = models.ManyToManyField(Author, through=Authorship)
    year = models.IntegerField(max_length=4)
    ...

    citation_key = models.CharField(max_length=9, blank=True, default="")
Run Code Online (Sandbox Code Playgroud)

目前,我使用管理界面使用"发布"的表单和内联表单"作者"填充我的数据.

我现在想要实现的目标:在数据发生变化后,应自动填充额外的citation_key-field(例如"Einstein1950").

我试图做的事情:我发现使用信号必须是最好的做法.

但是,当我更改作者身份时,不会触发"publicationm_changed" - "Publication.authors.through"上的信号.

@receiver(m2m_changed, sender=Publication.authors.through)
def authors_changed(sender, **kwargs):
    print("authors changed")
Run Code Online (Sandbox Code Playgroud)

相关主题中也讨论了这个问题,其中作者似乎在直通模型上使用"post_save".

@receiver(post_save, sender=Authorship)
def authorship_changed(sender, instance, **kwargs):
    print("authors changed")
Run Code Online (Sandbox Code Playgroud)

这似乎有用,但我必须记住,还没有涵盖删除,所以我添加了post_delete信号:

@receiver(post_delete, sender=Authorship)
def authorship_deleted(sender, instance, **kwargs):
    print("authors deleted")
Run Code Online (Sandbox Code Playgroud)

现在的问题是:如果我添加4个作者,我会将该事件触发4次.如果我想如前所述更新我的citation_key,这也会发生4次.

这可能是正确的解决方案吗?还是有更好的最佳做法?我认为它必须以某种方式使用m2m_changed信号,但我不知道如何.由于我是Django的新手,我不知道这对你来说是否是一个明显的解决方案.此外,在这种情况下,不必要的计算不应该产生巨大的影响,但它并不好.

我只在Django-Trac中发现了一个非常老的错误报告,似乎也解决了这个问题.但还没有解决方案.

django django-signals django-models

9
推荐指数
1
解决办法
996
查看次数

应用尚未加载.有信号

当我使用信号时,我有一个应用程序没有准备好样式错误.我认为这是由于配置文件模型中的用户身份验证,从我使用谷歌看到的用户身份验证存在一些问题.

我认为错误在这里:

class Profile_User(models.Model):
    user = models.OneToOneField(User, null=True)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何解决它.

带信号的型号:

from django.db import models 
from Modif_Box.models import Modif_Box_User
from Profile.models import Profile_User
from Post.models import Post_User
from django.utils import timezone
#from Modif_Box.get_models import get_modif_box_profile




# Create your models here.
class Box_Post_User(models.Model):
    receiver =  models.OneToOneField("Profile.Profile_User",related_name="receiver_post_box",blank=True,null=True)
    post = models.ManyToManyField("Post.Post_User",blank=True,related_name="post_in_box_user")
    modif_box = models.ForeignKey("Modif_Box.Modif_Box_User",blank=True,null=True)
    last_viewed = models.IntegerField(blank=True,null=True)
    date = models.DateTimeField(default=timezone.now, blank=True)
    date_sys_added = models.DateTimeField(default=timezone.now, blank=True)
    def __str__(self)  :
        try :
            return "%s : %s : %s" % (self.receiver.number,self.post,self.post_personna)
        except :
            return "%s : %s …
Run Code Online (Sandbox Code Playgroud)

django django-signals python-3.x

9
推荐指数
2
解决办法
6811
查看次数

仅在事务完成后才会触发post_save信号

我编写了一些API,其中各个函数在事务块中执行.我在save()一个/几个Model/s的实例/ s上调用该方法(经过一些修改),并且还在Elasticsearch中连续索引实例/ s的一些JSON相关信息.我希望数据库回滚,即使由于某种原因save(),其中一个实例或索引到Elasticsearch失败.

现在,出现的问题是,即使在事务块内部,post_save()信号也会被调用,这是一个问题,因为某些通知是从这些信号中触发的.

有没有办法post_save()在交易成功完成后触发信号?

api django transactions django-signals django-models

9
推荐指数
3
解决办法
4435
查看次数