如果您正在使用该queryset.delete()方法,Django正在发送pre/post_delete信号,但是它不应该发送pre/post_save queryset.update()吗?
我使用名为的自定义用户配置文件扩展了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?但是如果我在系统的其他部分创建一个新用户,我需要通过信号创建!
我有一个在Celerybeat实例中运行的任务.当执行该任务时,它有时会修改一个模型对象,该对象应触发post/pre_save信号,但事实并非如此.信号没有发生.我想这是因为Django的信号是同步的,而芹菜在不同的宇宙中的不同线程中的不同服务器上做这件事.是否有一种简单的方法可以让这些信号在芹菜中运行时被点燃?
我通过以下方式测试了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)
在manage.py shell中运行上面的代码:然后我运行我的网站并看到models.save()成功运行,但回调函数没有运行.
或者,我再次在shell上运行上面的代码,然后在shell中运行models.save()."save"再次运行良好,但回调函数仍未发生任何变化.
最后,我将上面的代码嵌入到一个__init__.py文件中,然后在网站上运行save()函数.但事实并非如此.
你能不能帮我弄清楚为什么pre_save信号看起来不起作用?
经历过
但答案无法解决我的问题,所以再问一遍.
我有一个应用程序添加到设置中的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
我正在为我的项目进行某种重构,我依赖于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) 我有一个模型文件,它使用一个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) 在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中发现了一个非常老的错误报告,似乎也解决了这个问题.但还没有解决方案.
当我使用信号时,我有一个应用程序没有准备好样式错误.我认为这是由于配置文件模型中的用户身份验证,从我使用谷歌看到的用户身份验证存在一些问题.
我认为错误在这里:
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) 我编写了一些API,其中各个函数在事务块中执行.我在save()一个/几个Model/s的实例/ s上调用该方法(经过一些修改),并且还在Elasticsearch中连续索引实例/ s的一些JSON相关信息.我希望数据库回滚,即使由于某种原因save(),其中一个实例或索引到Elasticsearch失败.
现在,出现的问题是,即使在事务块内部,post_save()信号也会被调用,这是一个问题,因为某些通知是从这些信号中触发的.
有没有办法post_save()在交易成功完成后触发信号?
django ×10
django-signals ×10
python ×3
transactions ×2
admin ×1
api ×1
celery ×1
django-apps ×1
foreign-keys ×1
inline ×1
python-3.x ×1