0

以下に単純なモジュールがあり、Person モジュールに次のフィールドがあります。

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

sarah、jim、ben という 3 つのアカウントを作成しました。私はサラにジムとベンをフォローさせることができましたが、サラがフォローした人を表示すると、オブジェクト自体ではなくクエリセットが返されます。それらを自分の Person モジュールに関連付けて、サラがフォローしている人々の名前を表示できるように、それらをオブジェクト自体に取得するために逆に作業するにはどうすればよいでしょうか。

これは私が理解していない部分です

>>> 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']

バーニーが示唆したように、ユニコード関数を設定すると、返されるデフォルトのクエリセットが同じことを行います。この特定のタイプのインスタンスでは、オブジェクトから得ているものをより明確にすることを好みますが、それは私だけです。

質問が更新された後に編集:

私はあなたがやろうとしていることに従っているかどうかわかりません。サラをフォローしている人々のオブジェクトのクエリセットがあります。名前だけが必要な場合は、上記の値リストが機能します。個々のオブジェクトを反復処理する場合は、次のようにします。

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)

そこから、ユーザー モデルを参照するフィルター ボードやその他のオブジェクトを使用できるようになります。

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