django - 重写保存方法以在多对多字段中添加列表

标签 django django-models

我有这个模型来保存用户的帖子:

class Tag(models.Model):
    name = models.CharField(max_length=255, unique=True)

def add_tags(obj_id, body):
    object = Post.objects.get(id=obj_id)
    tag_list = [Tag.objects.create(name=word) for word in body.split()]
    for tag in tag_list:
        object.tags.add(tag)

class Post(models.Model):
    user = models.ForeignKey(User)
    body = models.TextField()
    tags = models.ManyToManyField(Tag, blank=True)
    pub_date = models.DateTimeField(default=timezone.now)
    activity = GenericRelation(Activity, related_query_name="posts")

    def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)
        if self.body:
            body = self.body
            obj_id = self.id
            add_tags(obj_id, body)

因此,每当用户发布内容时,我都会检查正文中是否使用了任何哈希标签。如果有标签,则获取列表内的标签。

但是当我发帖时,会创建标签对象,但它们不会添加到 Post.tags 字段。

post.body 示例 = 检查 http://somesitedotcom/page#idtop 中的 # #天啊是的!

我在这里做错了什么?

最佳答案

这是人们常犯的错误。为了更新模型对象的 m2m 关系,需要首先将该对象保存在数据库中。 Django m2m本质上是使用中间表来存储关系,所以如果两端不保存,则无法形成关系。

我不会依赖于覆盖 save()方法来实现这一点,而是在views方法中单独处理这个过程,因为save()任何情况都可能发生,但你可能不会总是在这个过程中发生什么。为了正确起见,您应该在调用 super(Post, self).save(*args, **kwargs) 后执行此操作。在 save方法。

编辑:

听起来你的代码也有错误。 tag_list是一个字符串列表,但是你的代码 self.tags.add(*tag_list)将它们视为 Tag对象。您需要创建 Tag对象然后使用 add链接关系。

关于django - 重写保存方法以在多对多字段中添加列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471245/

相关文章:

python - django - 在 ManyToMany 和 ForeignKey 中使用 related_name

django - 在 Django 中归档模型数据

django - 给定一个项目,在 Django 查询集中查找上一个和下一个项目

django - 狮身人面像 : Autodoc ImportError

mysql - 当数据库字符集已设置为utf8mb4时,Django utf8 DatabaseError发生

python - 获取forloop计数器最后使用的值

python - Django 多对多查询集过滤器

使用 _set.all 的 Django 模板

python - Django:通过类似字典的接口(interface)访问表

python - sqlite 真空与 django