2013-03-13 68 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的书

相关问题