Django多对多保存

时间:2013-09-14 11:43:05

标签: django django-models many-to-many

我正在为一个网站撰写新闻页面,并且有两个具有多对多关系的模型:标签和帖子。 现在,我想在每个页面上显示最受欢迎的标签,并且为了避免每次用户访问页面时计算多对多关系链接的数量,我为每个标签存储一个计数器。我的想法是修改Post的“保存”方法以增加该计数器。 以下是这两个模型的代码:

class Tag(models.Model):
    tag_text = models.CharField(max_length=100, verbose_name='Tag')
    amount = models.IntegerField(blank=True, null=True, default=0)

    def __unicode__(self):
        return self.tag_text

class Post(models.Model):

    IS_DRAFT = (("Y", "Draft post"), ("N", "Finished post"),)

    title = models.CharField(max_length=100)
    slug = models.CharField(max_length=60, unique=True, blank=True)
    text = RichTextField()
    created_on = models.DateTimeField(auto_now_add=True, verbose_name='Created on')
    last_edited_on = models.DateTimeField(auto_now=True, verbose_name='Last edited on', db_index=True)
    draft = models.CharField(choices=IS_DRAFT, max_length=1, verbose_name='Is a post draft')
    tag = models.ManyToManyField(Tag)

    class Meta:
        ordering = ['created_on']

    def save(self, *args, **kwargs):
        if not self.id:
            date = datetime.now()
            tr_title = unicode(unidecode(self.title))
            self.slug = '%i/%i/%i/%s' % (
                date.year, date.month, date.day, slugify(tr_title)
            )
        super(Post, self).save(*args, **kwargs)
        print 'count', self.tag.count()
        for t in self.tag.all():
            print 'tag amount', t.amount
            t.amount += 1
            t.save()

    def __unicode__(self):
        return self.title

我在保存方法中添加了打印件以用于测试目的,因为由于某种原因,行

print 'count', self.tag.count()

输出0(好像没有为此模型实例分配标签)。 但是,在保存方法期间打印出任何其他字段工作正常。例如:

print 'title', self.title

输出标题,因此访问模型字段不是问题。 我可以做些什么吗?或者我是否必须借助信号来做我想做的事情?

1 个答案:

答案 0 :(得分:1)

ManyToManyField项目在保存之前无法添加到模型中。

您的代码没有显示您创建模型的位置,因此不清楚放置计数器的最佳位置在哪里。

基本上你需要修改添加标签的方法,而不是保存添加标签之前运行的帖子的方法。

编辑:一个简单的选项是明确定义ManyToMany关系的直通模型,然后你可以修改它的保存方法并在那里递增:https://docs.djangoproject.com/en/1.5/topics/db/models/#many-to-many-relationships