2013-03-24 60 views
0

我为以下功能实现了ManyToManyField,该功能允许用户关注其他用户以及他们是否跟随其他用户。 他们将能够检索他们的对象。Django ManyToManyField检索两个对象错误

这是我的模块

class Person(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100, blank=True) 
    image = models.FileField(upload_to="images/",blank=True) 
    following = models.ManyToManyField('self', related_name='followers', symmetrical=False, blank=True, null=True) 
    birthday = models.DateField(blank=True,null=True) 

    def __unicode__(self): 
     return self.name 

class Board(models.Model): 

    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 
    picture = models.OneToOneField('Picture',related_name='picture',blank=True,null=True) 
    def __unicode__(self): 
     return self.name 

用户是继2个用户,如果问题。我只能够检索单个用户对象而不是两个用户。

例如,我创建了3个用户,Jimmy,Sarah和Simon。萨拉是继西蒙和吉米

吉米董事会叫吉米的数学局,吉米英文局 西蒙有一个单板叫西蒙的白板

的问题是下面

>>> from pet.models import * 
>>> from django.contrib.auth.models import User 
>>> user = User.objects.get(username='Sarah') 
>>> person = Person.objects.get(user=user) 
>>> sarah = Person.objects.get(user=user) 
>>> sarah.following.all() # SARAH IS FOLLOWING JIMMY AND SIMON 
[<Person: Jimmy>, <Person: Simon>] 
>>> users = User.objects.filter(pk__in=sarah.following.all().values_list('user__pk',flat=True)) 
>>> users 
[<User: Jimmy>, <User: Simon>] # I'm able to retrieve their users 
>>> board = Board.objects.filter(user=users) # when I search for their boards , I only retrieve a single user . Jimmy's board not Simon 
>>> board 
[<Board: Jimmy's Math Board>, <Board: Jimmy English Board>] 
>>> person = Person.objects.filter(user=users) 
>>> person 
[<Person: Jimmy>] 

如何取回这两个用户板?

+0

什么'Board.objects.filter(user__in = sarah.following.all()。values_list( 'user__pk',扁=真))'return? – Ngenator 2013-03-24 02:35:58

+0

@Ngenator这是回报[,]但当我做Board.objects.filter(用户=用户)。它只能检索吉米的董事会,而不是两个西蒙的董事会 – donkeyboy72 2013-03-24 02:37:51

+0

@Ngenator感谢您的编辑 – donkeyboy72 2013-03-24 02:38:15

回答

1

因为board = Board.objects.filter(user=users)正在过滤user它期望提供一个用户。如果您要执行类似board = Board.objects.filter(user__in=users)(使用__in过滤器),则过滤将正确使用用户对象列表。

您也可以使用ID的对象,而不是一个平面列表,像这样board = Board.objects.filter(user__in=sarah.following.all().values_list('user__pk',flat=T‌​rue))

+0

谢谢你帮助我:} – donkeyboy72 2013-03-24 03:00:19

相关问题