2017-01-04 50 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