2013-03-13 69 views
0

目前我正在學習ManyToManyField.I有一個我完全不理解的場景。Django ManyToManyField添加用戶

例如,這是我的module.I創建3個帳戶叫吉姆,託尼和瑪麗

我得到了用戶小麗跟着吉姆。我可以通過點擊管理頁面上的保管箱中的Jim,輕鬆地讓Jim跟隨Jim。我一直在試圖弄清楚如何讓Mary在shell提示符下使用manytomanyfield跟隨jim,只使用這些信息。 Mary的用戶對象 和Jim的用戶名。

Mary = User.objects.get(username='Mary') 
Jim = User.objects.get(username='Jim') 

我怎樣才能讓瑪麗跟隨吉姆?就像在管理頁面

class Person(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100, blank=True) 
    following = models.ManyToManyField('self', related_name='followers', symmetrical=False, blank=True, null=True) 

    def __unicode__(self): 
     return self.name 
+0

這是我不明白的領域。 Hands-off :) – catherine 2013-03-13 12:09:17

回答

3
mary = User.objects.get(username='Mary') 
jim = User.objects.get(username='Jim') 

#just make sure your user is saved before adding the relationship. 

jim.following.add(mary) 
jim.save() 

當指定你做了什麼你額外的字段基本上說明你想怎麼的關係的工作。

models.ManyToManyField()在幕後做了什麼是創建一箇中間數據庫表,通常看起來像這樣的「app_model1_model2」,命名可能會關閉,但你明白了。

self意味着你正在與同一個模型定義關係。 因此,您不會得到user_set,但由於您已決定在symmetry中設置False,因此您會強制Django添加一個。

在代碼中的含義是,你可以做user.user_set.all()來獲取所有相關的用戶!

related_name='followers'意味着你正在命名你的關係followers,而不是Django生成的名稱,否則我認爲它將沿着「用戶」的方向。 也就是說。你給它一個更好的意義和代表你想要達到的目標。

這在文檔中解釋得非常好!

Django docs ManyToMany-fields

+0

我很困惑,它說你需要指定模型所需關係的所有細節。簡單的添加,創建和賦值調用不提供指定這些額外細節的方法。所以我雖然我需要指定Person模塊的所有細節,然後才能保存https://docs.djangoproject.com/en/dev/topics/db/models/ – donkeyboy72 2013-03-13 12:10:20

+0

如果我理解正確的話,那麼您需要指定它在模型級別上,但不在「添加」級別上。 – 2013-03-13 12:12:10

+0

謝謝你的幫助 – donkeyboy72 2013-03-13 12:13:05

0
>>> Mary = User.objects.get(username='Mary') 
>>> Jim = User.objects.get(username='Jim') 
>>> Jim.following.add(Mary) 
>>> Jim.save() 

Django ManyToMany example從Django的書

相關問題