All Articles

simple django relationship

経緯

Django案件でユーザー間のフォロー機能を作成しそうなものがあるので、 どのようにするのがシンプルか考えてみた。

やること

  • django.contrib.auth.modelsのUserモデルを拡張してインスタンスメソッドを追加する
  • RelationshipモデルをUserの中間テーブルとして作成し、フォロー管理をする

使うパッケージ

  • Django==1.9.7

ソースコード

ここにあります

snsプロジェクトとuserアプリを作成しています。
実際に編集しているのはuser/models.pyのみで、以下のようになっています。

from django.db import models
from django.contrib.auth.models import User as DjangoUser

'''
DjangoのデフォルトUserモデルを継承して、インスタンスメソッドを追加している
'''
class User(DjangoUser):

    '''
    新規にtableを作成せずに継承したmodelの拡張のみを行いたいので、
    MetaクラスのproxyをTrueにしている。
    '''
    class Meta:
        proxy = True

    '''
    Userインスタンスがフォローしているuserを返す関数
    '''
    def get_followers(self):
        relations = Relationship.objects.filter(follow=self)
        return [relation.follower for relation in relations]
        


'''
フォローしている人と、フォローされている人をつなぐ中間テーブル
'''
class Relationship(models.Model):
    follow = models.ForeignKey(User, related_name='follows')
    follower = models.ForeignKey(User, related_name='followers')

DjangoのUserモデルを拡張したい場合にはMetaクラスをいじる必要があるのがミソな気がします。ここに詳しく書いてあります。 Relationshipモデル内でrelated_nameを定義していますが現段階では必要ありません。

感想

フォロー機能を追加するには様々な方法があると思うんですが、今回は自分が取れる一番シンプルそうな、方法を取ってみました。
他にもっといい方法が必ずあると思うんですが、まあdjangoのuserモデルを拡張する方法を調べれたので満足しています。 これよりもいい感じの方法をご存知の方おられましたら是非教えていただきたいです。

Published 16 Dec 2016