我有这个模型来保存用户的帖子:
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/