2016-10-16 8 views
0

のためのデータベース設計、私が持っている、テーブル「フォロワー」を作っています:Djangoのモデル:Djangoのモデルでは、ユーザーとフォロワー

user's id. (this is followed by) 
user's id (this is follower) 

ユーザーが他のユーザーを追跡することができます簡単です。

モデルをDjangoでどのように定義する必要がありますか?

私はこれを試してみましたが、動作しません:

user = models.ForeignKey('self') 
follower_id = models.ForeignKey('self') 

はこれをどのように行うべきか?

おかげ

答えて

1

あなたはselfと呼ばれるモデルを持っていない限り、「自己」引数が機能しません。

あなたの割り当てモデルがFollowingと呼ばれていると仮定すると、あなたは、あなたが行うことができますUserモデルで構築を使用している:

class Following(models.Model): 
    target = models.ForeignKey('User', related_name='followers') 
    follower = models.ForeignKey('User', related_name='targets') 

これはおそらくさらにいくつかの独自性と検証ロジックが必要になります。

related_name属性に注意してください。https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey.related_nameを参照してください。これは、与えられたユーザオブジェクトに対して、彼らが従うユーザを得るためにuser.targets.all()、それに続くユーザを得るためにuser.followers.all()を行うことができることを意味する。

Djangoは、ORM内のIDではなくターゲットモデルインスタンスを返します。つまり、基礎となるテーブルがfollower_idと呼ばれても、Pythonコードfollowing.followerは実際のUserオブジェクトを返します。

+0

私はこのエラーを受けました。しかし、私はこのエラーを受け取ります: main.followers.follower_id:(fields.E304) 'followers.follower_id'のリバースアクセサは 'followers.user'のリバースアクセサと衝突します。 \tヒント: 'followers.follower_id'または 'followers.user'の定義にrelated_name引数を追加または変更します。 – Sach

+0

と '自己'は再帰的な関係のため...右ですか? – Sach

+0

ああ、そうです。 Djangoはリバースリレーションシップを作成するので、リレーションシップを逆にすることができます。私は 'related_name'属性を追加する答えを修正しました。 – nimasmi