介绍一下 最近遇到的问题
利用signal 在 创建文章的保存后,对 tag的tag_nums 进行加一 操作
model
class Tag(models.Model):
name = models.CharField(max_length=20,verbose_name='标签')
tag_nums = models.IntegerField(default=0,verbose_name='标签文章')
add_time = models.DateField(default=datetime.now)
class Meta:
verbose_name = '标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Post(models.Model):
tag = models.ManyToManyField(Tag,verbose_name="标签",null=True,blank=True,related_name='tags')
add_time = models.DateField(default=datetime.now)
class Meta:
verbose_name = "文章"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
signals
@receiver(post_save,sender=Post)
def post_tag_nums(sender,instance=None,created=False,**kwargs):
if created:
post = Post.objects.get(id=instance.id)
all_tags = post.tag.all()
for tag in all_tags:
tag.tag_nums += 1
tag.save()
测试了很多方法 首先利用的就是 post_save 当文章创建进行保存后,
首先直接从实力instance中获取 tag 结果得到结果是None 然后利用m2m一样是None
然后 就想到 难道是实例的问题
我就获取到了 实例id 然后 在Post中进行查询 然后在进行查询 发现依然是 None
我就觉得可能是因为 post_save 只是进行post文章的保存,而多对多关系的第三张表 它还没有进行保存,所以查不到数据,只有执行完后 才可以查询到
这一点 可以利用修改文章 在保存,同样 他就可以查询出来
这个问题如何处理目前还不知道,利用下面的方法可以 进行保存 因为它执行了两次 第二次就可以保存
但是如果进行 修改他依然回在进行一次 这就很尴尬 最好的就是不要修改
from django.db.models.signals import post_save,pre_save,m2m_changed
from django.dispatch import receiver
from .models import Post
@receiver(m2m_changed,sender=Post.tag.through)
def post_click(sender,instance=None,reverse=False,action=None,**kwargs):
if action=='post_add':
all_tags = instance.tag.all()
for tag in all_tags:
tag.tag_nums += 1
tag.save()
网友评论