我有一个非常通用的文章模型,与标签模型有m2m关系.我想保留每个标签使用的计数,我认为最好的方法是对标签模型上的计数字段进行非规范化,并在每次保存文章时更新它.我怎样才能做到这一点,或者有更好的方法?
我想知道是否有可能在对象创建时选择性地抑制Django信号(例如post_save或post_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_param将signup方法中的变量获取到createUserProfile方法,在该方法中将变量存储为Profile对象的一部分?
我希望管理员在删除某些对象时收到通知,但我也想确定哪个用户正在执行删除.
可能吗?
这是代码:
# 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) 我可能需要一些帮助来设计我的模型及其关系.
每个标签可用于Book的多个实例(例如"指环王"和"Discworld"都有"Fantasy"标签).
每个Aspect可以在Tag的多个实例中使用(例如"Fantasy"和"Scifi"都具有"World Detail"方面).
这是一个描述性图像:

(哇,这些都很大)
因为我想存储与特定书籍相关的每个方面的用户评级.
这是主要问题.我想在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) 我需要检测一个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错误的帖子,也许它还没有被修复......(或者它是我^^)
我有以下型号:
class Item(models.Model):
# fields
# ...
class Collection(models.Model):
items = models.ManyToManyField(Item, related_name="collections")
# other fields
# ...
Run Code Online (Sandbox Code Playgroud)
现在我想要两件事:
Item可以添加到Collection.Collection如果Item添加或删除了一些字段,我希望更新它的一些字段.对于第二个问题,我知道django.db.models.signals.m2m_changed我可以使用它来挂钩关系的变化.允许/确定更改Collection信号回调内部吗?我是否也可以使用该信号"中止"问题1的插入?
这可能是一个蹩脚的问题,但我真的很困惑这两个.我知道signals当事情发生时我习惯做一些任务.但芹菜怎么样?在文档中它说:
Celery是基于分布式消息传递的异步任务队列/作业队列.
有人请告诉我芹菜是什么吗?这两者之间有什么区别以及何时使用它们?将不胜感激!谢谢.
我使用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似乎更健壮,但在那时我无法看到模型实例中发生了什么变化.我想在我的模型的保存功能中阻止使用全局变量或实现某些东西.
我的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被保存".我做错了什么?
signal在Django中使用时遇到一些问题.
post_save由于instance.save()函数内部发生递归.
但奇怪的是只有一种情况发生递归.
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()它时不会发生递归.
models.py
class Variation(TimeStampedModel):
COLOR_CHOICES = (
('black', '??'),
('single', '??'),
('multi', …Run Code Online (Sandbox Code Playgroud)