【问题标题】:How to save many to many field?如何保存多对多字段?
【发布时间】:2012-11-05 14:22:07
【问题描述】:

我想计算标签。我有帖子模型和标签模型,并且帖子模型有很多标签字段。当我想添加新帖子的同时我为帖子添加标签时,它必须增加标签计数。

我的帖子和标签模型:

class Post(models.Model):

    tags = models.ManyToManyField(Tag,blank=True,null=True,verbose_name=_('tags'))

    def save(self)
       super(Post, self).save()
       for i in self.tags.all():
       i.save() 

class Tag(models.Model):

    name=models.CharField(max_length=30,verbose_name=_('name'))
    count = models.IntegerField(blank=True,null=True,default=0)
    slug = models.SlugField(blank=True,null=True)

    def save(self):
       self.slug = slugify(self.name.upper())
       self.count = Post.objects.filter(tags__name=self.name).count()
       super(Tag, self).save()

当我添加新帖子时,我查看标签模型并看到计数没有改变,但是当我在标签管理中按下保存按钮时,我看到了真实计数。但是我想在不按标签中的保存按钮的情况下查找标签管理员时查看实际计数。

我还希望当我编辑帖子时它不应该再次增加标签数。

【问题讨论】:

  • 您似乎正在处理this 问题。

标签: python django django-models django-admin


【解决方案1】:

我会使用m2m_changed signal 来解决这个问题。

【讨论】:

    【解决方案2】:

    您可以执行以下操作:

    class Post(models.Model):
    
        tags = models.ManyToManyField(Tag,blank=True,null=True,verbose_name=_('tags'))
    
        def save(self)
            super(Post, self).save()
            for tag in self.tags :
                tag.count = tag.post_set.count()
                tag.save()
    

    或者,不是将计数值保存到字段中,而是在需要时进行查找:

    tag.post_set.count()
    

    您可以向Tag 添加一个函数来轻松完成此操作:

    def count(self) :
        return self.post_set.count()
    

    【讨论】:

    • 张贴您的管理表格和屏幕截图,以便我可以看到您在说什么。另外,您选择了哪种解决方案?
    • 实际上我在标签管理员或帖子管理员中没有做任何特别的事情。我能做什么?
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2018-09-30
    • 2018-10-01
    • 2023-04-02
    • 2017-01-17
    • 2015-10-30
    • 2019-10-24
    相关资源
    最近更新 更多