14

私はDjango/pythonの関係で遊んでいますが、ユーザーとそのフォロワー、および彼がフォローしているユーザーのフォロワーとの間にどのように関係を作成するのでしょうか。

あなたの意見を読みたいです...

4

3 に答える 3

26

まず、ユーザーに関する追加情報を保存する方法を理解する必要があります。1人のユーザーと関係のある別のモデルである「プロファイル」モデルが必要です。

次に、M2Mフィールドを使用できます。ただし、 django-annoyingを使用すると仮定すると、ユーザープロファイルモデルを次のように定義できます。

from django.db import models

from annoying.fields import AutoOneToOneField

class UserProfile(models.Model):
    user = AutoOneToOneField('auth.user')
    follows = models.ManyToManyField('UserProfile', related_name='followed_by')

    def __unicode__(self):
        return self.user.username

そしてそれをそのように使用します:

In [1]: tim, c = User.objects.get_or_create(username='tim')

In [2]: chris, c = User.objects.get_or_create(username='chris')

In [3]: tim.userprofile.follows.add(chris.userprofile) # chris follows tim

In [4]: tim.userprofile.follows.all() # list of userprofiles of users that tim follows
Out[4]: [<UserProfile: chris>]

In [5]: chris.userprofile.followed_by.all() # list of userprofiles of users that follow chris
Out[5]: [<UserProfile: tim>]

また、 django-subscriptiondjango-actstreamdjango-social(おそらく使いにくい)などのアプリをチェック/再利用できることに注意してください...

通知アクティビティのdjangoパッケージを確認することをお勧めします。これらはすべて、フォロー/サブスクリプションデータベースの設計を必要とするためです。

于 2012-05-15T14:48:50.830 に答える
4

これは私がそれをする方法です:

class Tweeter(models.Model):  
    user = models.ManyToManyField('self', symmetrical=False, through='Relationship')

class Relationship(models.Model):  
    who = models.ForeignKey(Tweeter, related_name="who")
    whom = models.ForeignKey(Tweeter, related_name="whom")

シェルでは、

[1]の場合:t = Tweeter()

[2]の場合:t.save()

[3]の場合:f = Tweeter()

[4]の場合:f.save()

[5]の場合:r = Relationship()

[6]の場合:r.who = t

[7]の場合:r.whom = f

[8]の場合:r.save()

[18]の場合:Relationship.objects.all()[0] .who.id
Out [18]:1L

In [19]:Relationship.objects.all()[0] .whom.id
Out [19]:2L

于 2012-05-15T15:04:41.643 に答える
1

編集:コメント投稿者が示唆しているように、ManyToManyFieldを使用する方が理にかなっています。ユーザーは0〜x人のユーザーフォロワーを持つことができ、ユーザーは0〜x人のユーザーをフォローできます。

https://docs.djangoproject.com/en/1.3/ref/models/fields/#manytomanyfield

コードに入る必要はありませんが、これ以上言うことはありません。

于 2012-05-15T14:15:41.587 に答える