美文网首页
django:signal使用(二)

django:signal使用(二)

作者: 你常不走的路 | 来源:发表于2018-03-10 18:06 被阅读31次

介绍一下 最近遇到的问题
利用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()

相关文章

网友评论

      本文标题:django:signal使用(二)

      本文链接:https://www.haomeiwen.com/subject/uidbfftx.html