0

我在下面有一个简单的模块,并且在 Person 模块中有一个名为 following 的字段。

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

我创建了 3 个帐户,分别为 sarah、jim 和 ben。我设法让莎拉跟随吉姆和本,但是当我显示莎拉跟随谁时,它返回一个查询集而不是他们自己的对象。我怎样才能反向工作以将它们自己放入对象中,以便我可以将它们与我的 Person 模块相关联并显示 sarah 关注的人的姓名。

这是我不明白的部分

>>> from pet.models import *
>>> from django.contrib.auth.models import User
>>> sarah = User.objects.get(username='Sarah')
>>> jim = User.objects.get(username='Jim')
>>> ben = User.objects.get(username='Ben')
>>> Sarah = Person.objects.get(user=sarah)
>>> Jim = Person.objects.get(user=jim)
>>> Ben = Person.objects.get(user=ben)
>>> Sarah.following.add(Jim,Ben) //setup the many to many relationship
>>> Sarah.save()
>>> Sarah.following.all() // return a queryset of Person objects which john is following.
[<Person: Jim>, <Person: Ben>]

我想返回用户在我的模板中关注的所有用户对象。

@SI 埃里克

>>> Sarah.following.all().values_list('name',flat=True)
[u'Jim', u'Ben']
>>> p =  Sarah.following.all().values_list('name',flat=True)
>>> person = Person.objects.filter(user=p)
>>> print person

class Board(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    def __unicode__(self):
        return self.name
4

1 回答 1

1
Sarah.following.all().values_list('name', flat=True)

会输出

['Jim', 'Ben']

正如 bernie 建议的那样,您可以设置unicode函数,返回的默认查询集也会这样做。在这种特殊类型的实例中,我更喜欢更明确地说明我从对象中得到的东西,但这只是我。

问题更新后编辑:

我不确定我是否遵循您要执行的操作。您有一个跟踪莎拉的人的对象的查询集。如果您只想要名称,上面的值列表将起作用。如果您想遍历每个单独的对象,那么您将执行以下操作:

for person in Sarah.following.all():
    # person is an instance of Person
    # you can access all the properties of the object by accessing person
    print person.name

或者,通过将整个查询集添加到视图中的上下文,将整个查询集传递给模板:

context['following'] = Sarah.following.all()

然后在模板中你可以这样做(例如):

<ul>
    {% for person in following %}
        <li>{{ person.name }}</li>
    {% endfor %}
</ul>

编辑: 从模板和视图代码中,您都可以通过直接引用它们来访问每个“Person”对象的任何属性。因此,例如,如果您想访问与人有外键关系的“用户”对象的属性,您只需直接访问它的属性,如下所示:

person.user.username
person.user.email
etc...

最后一个编辑: 要基于一个人的“以下”查询集获取“用户”对象的查询集,您可以这样做:

users = User.objects.filter(pk__in=Sarah.following.all().values_list('user__pk', flat=True)

从那里您应该可以使用该过滤板和其他引用 User 模型的对象:

boards = Board.objects.filter(user__in=users)
于 2013-03-12T22:13:57.707 回答