2017-01-04 47 views
0

我有这样的模式来拯救员额从用户:覆盖保存方法在许多添加列表到许多领域

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 example = Check#from the http://somesitedotcom/page#idtop#shell yeah!

我在这里做错了什么?

+1

专业提示:您不需要添加[请帮助我](https://stackoverflow.com/search?q=user%3A2634889+please+help+me)或类似于您的所有问题。很明显,你需要帮助,所以这种填充材料可能会被解释为乞求,而且它常常被编辑剪裁。 – halfer

+1

@halfer好吧,明白了。谢谢。 – Robin

回答

0

,直到它被保存你不能用一个tag关联Post

def save(self, *args, **kwargs): 
    super(Post, self).save(*args, **kwargs) 
    if self.body: 
     tag_list = [word for word in self.body.split() if word.startswith("#")] 
     self.body = tag_list 
     self.tags.add(*tag_list) 
+0

是的,我现在没有得到以前的错误。但相反,我得到这个错误:'无效的字面值int()与基地10:'#hell'' – Robin

0

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

我不会依赖重写save()方法来实现这一点,而是在视图方法中分别处理这个过程,因为save()可以在任何情况下发生,但是您可能并不总是发生这个过程。为了正确起见,您应该在save方法中调用super(Post, self).save(*args, **kwargs)后执行此操作。

编辑:

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

+0

好吧,所以我改变了save()方法。但是我得到这个错误:'无效的字面值int()与基地10:'#地狱' – Robin

+0

我编辑我的答案解决您的问题。看看它是否有道理。 –

+0

我已更新该问题。 – Robin