标签: django-signals

m2m字段上的post_save信号

我有一个非常通用的文章模型,与标签模型有m2m关系.我想保留每个标签使用的计数,我认为最好的方法是对标签模型上的计数字段进行非规范化,并在每次保存文章时更新它.我怎样才能做到这一点,或者有更好的方法?

python django django-signals

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

是否有可能选择性地抑制Django中的post_save(或其他)信号?

我想知道是否有可能在对象创建时选择性地抑制Django信号(例如post_savepost_init),或者,发送它某些参数.

我所拥有的是一个User对象,可以在我的代码中以多种不同的方式创建.因此,要自动Profile为每个对象分配一个自定义对象User,我使用该post_save信号.但是,在一个特定情况下,我想要绑定到创建的Profile对象的额外信息.将它作为post_save信号的参数传递将是很好的,但它看起来不可能.

另一种选择是手动创建Profile对象,但是在User保存之后我需要这样做,否则Profile无法绑定到User实例.User但是,保存实例会导致Profile通过信号调用的函数创建另一个实例.

而且我不能只获得刚刚创建的Profile对象,因为这会导致'Profile' object is unsubscriptable错误.有什么建议?

更新:

以下是可能情况的示例:

def createUserProfile(sender, instance, created, **kwargs):
if created:  
    profile, created = Profile.objects.get_or_create(user=instance)
    if extra_param:
        profile.extra_param = extra_param
    profile.save()

post_save.connect(createUserProfile, sender=User)

def signup(request):
   ...
   extra_param = 'param'
   user.save()
Run Code Online (Sandbox Code Playgroud)

如何extra_paramsignup方法中的变量获取到createUserProfile方法,在该方法中将变量存储为Profile对象的一部分?

django django-signals

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

Django:确定在使用post_delete信号时哪个用户正在删除

我希望管理员在删除某些对象时收到通知,但我也想确定哪个用户正在执行删除.

可能吗?

这是代码:

# models.py
# signal to notify admins when nodes are deleted
from django.db.models.signals import post_delete
from settings import DEBUG

def notify_on_delete(sender, instance, using, **kwargs):
    ''' Notify admins when nodes are deleted. Only for production use '''
    if DEBUG:
        #return False
        pass
    # prepare context
    context = {
        'node': instance,
        'site': SITE
    }
    # notify admins that want to receive notifications
    notify_admins(instance, 'email_notifications/node-deleted-admin_subject.txt', 'email_notifications/node-deleted-admin_body.txt', context, skip=False)

post_delete.connect(notify_on_delete, sender=Node)
Run Code Online (Sandbox Code Playgroud)

python django django-signals django-models django-sessions

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

Django中具有多个多对多关系的数据库建模

我可能需要一些帮助来设计我的模型及其关系.

简短概述

  • :书名(例如"指环王")
  • 标签:与书籍相关的标签(例如"幻想","巫师","史诗般的战斗")
  • 方面:与标签相关的方面,或者换句话说,用户在特定标签出现时可以评价的事物,例如:
    • 对于标签"幻想"方面可能是"世界细节"和"时间"
    • 对于标签"史诗般的战斗"方面可能是"戈尔水平"和"战斗紧张"

每个标签可用于Book的多个实例(例如"指环王"和"Discworld"都有"Fantasy"标签).

每个Aspect可以在Tag的多个实例中使用(例如"Fantasy"和"Scifi"都具有"World Detail"方面).

这是一个描述性图像:

在此输入图像描述

(哇,这些都很大)

"为什么你需要额外的桌面BookAspect?" 你可能会问?

因为我想存储与特定书籍相关的每个方面的用户评级.

这是主要问题.我想在Django中对此进行建模,这是我到目前为止所得到的:

class Book(models.Model):
    title = models.CharField(max_length=100, unique=True)
    tags = ManyToManyField(Tag)
    # the following line is a workaround...
    aspects = models.ManyToManyField(Aspect, through='BookAspect')

class Tag(models.Model):
    name = models.CharField(max_length=100)
    aspects = models.ManyToManyField(Aspect)

class Aspect(models.Model):
    name = models.CharField(max_length=100)

# this class is a workaround ...
class BookAspect(models.Model):
    book = models.ForeignKey(Book)
    aspect = models.ForeignKey(Aspect)
    # this is from django-ratings
    rating = …
Run Code Online (Sandbox Code Playgroud)

python django many-to-many django-signals django-models

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

一个信号m2m_changed和post_remove的bug

我需要检测一个post_remove信号,所以我写了:

def handler1(sender, instance, action, reverse, model, pk_set, **kwargs):
if (action == 'post_remove'):
    test1()  # not declared but make a bug if it works, to detect :)

m2m_changed.connect(handler1, sender=Course.subscribed.through)
Run Code Online (Sandbox Code Playgroud)

如果我用'post_add'改变'post_remove'就可以了..这是关于post_remove的django的错误吗?

我使用该模型并在两个'subscribed'值之间切换(所以添加一个,删除一个)

class Course(models.Model):
    name = models.CharField(max_length=30)
    subscribed = models.ManyToManyField(User, related_name='course_list', blank=True, null=True, limit_choices_to={'userprofile__status': 'student'})
Run Code Online (Sandbox Code Playgroud)

我看过一篇有django错误的帖子,也许它还没有被修复......(或者它是我^^)

django django-signals

6
推荐指数
2
解决办法
2302
查看次数

Django多对多关系插入控件

我有以下型号:

class Item(models.Model):
    # fields
    # ...

class Collection(models.Model):
    items = models.ManyToManyField(Item, related_name="collections")
    # other fields
    # ...
Run Code Online (Sandbox Code Playgroud)

现在我想要两件事:

  1. 我想控制是否Item可以添加到Collection.
  2. Collection如果Item添加或删除了一些字段,我希望更新它的一些字段.

对于第二个问题,我知道django.db.models.signals.m2m_changed我可以使用它来挂钩关系的变化.允许/确定更改Collection信号回调内部吗?我是否也可以使用该信号"中止"问题1的插入?

django django-signals django-models

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

django - 信号与芹菜的区别

这可能是一个蹩脚的问题,但我真的很困惑这两个.我知道signals当事情发生时我习惯做一些任务.但芹菜怎么样?在文档中它说:

Celery是基于分布式消息传递的异步任务队列/作业队列.

有人请告诉我芹菜是什么吗?这两者之间有什么区别以及何时使用它们?将不胜感激!谢谢.

django-signals celery django-celery

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

Django:将变量从pre_save传递到post_save信号

我使用pre_save和post_save信号将分析发送到Mixpanel.我更喜欢将它与我的模型的保存方法分开.

有没有办法在pre_save信号出现时保存实例的旧值,然后在post_save上检查新值?

我的代码看起来像这样:

@receiver(pre_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    activity_completed_old_value = kwargs['instance'].is_completed
    # store this value somewhere?

@receiver(post_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    if kwargs['instance'].is_completed != activity_completed_old_value:
        # send analytics
Run Code Online (Sandbox Code Playgroud)

对我来说,使用post_save发送分析而不是pre_save似乎更健壮,但在那时我无法看到模型实例中发生了什么变化.我想在我的模型的保存功能中阻止使用全局变量或实现某些东西.

django django-signals

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

Django信号不起作用

我的models.py:>

class Aval(models.Model):
    cliente = models.ForeignKey(Cliente)
    salao = models.ForeignKey(Salao)
    rate = models.IntegerField(choices=RATE, default=5)
    criacao = models.DateTimeField(blank=True, null=True, auto_now=True)
    comentario = models.TextField(max_length=400, blank=True, null=True, default=None)
    aprovado = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

我的signals.py:>

@receiver(post_save, sender=Aval)
def new_rate(sender, instance, created, **kwargs):
    aval = instance

    print("Aval is saved.")
Run Code Online (Sandbox Code Playgroud)

我正在为Aval模型测试信号post_save,当我保存一些对象Aval时,它不打印"Aval被保存".我做错了什么?

python django django-signals

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

如何在Django中阻止post_save递归?

signal在Django中使用时遇到一些问题.

post_save由于instance.save()函数内部发生递归.

但奇怪的是只有一种情况发生递归.

  1. 不发生递归的情况.

models.py

class Product(TimeStampedModel):
    name = models.CharField(max_length=120)
    slug = models.SlugField(null=True, blank=True)
    description = models.CharField(max_length=400, blank=True)
    is_active = models.BooleanField(default=True)

    objects = ProductManager()

    class Meta:
        ordering = ('-created',)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse(
            "products:product_detail",
            kwargs={
                "slug": self.slug,
            }
        )
Run Code Online (Sandbox Code Playgroud)

signals.py

@receiver(post_save, sender=Product)
def post_save_product(sender, instance, created, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.name, allow_unicode=True)
        instance.save()
Run Code Online (Sandbox Code Playgroud)

当我创建Product使用Product.objects.create()它时不会发生递归.

  1. 发生递归的情况

models.py

class Variation(TimeStampedModel):
    COLOR_CHOICES = (
        ('black', '??'),
        ('single', '??'),
        ('multi', …
Run Code Online (Sandbox Code Playgroud)

django django-signals

6
推荐指数
4
解决办法
2496
查看次数