データをユーザー ペアに関連付ける必要があるアプリを作成しています。たとえば、各ユーザー ペアには、それらに関連付けられた互換性スコアと、共通のアーティストなどの多対多の関係があります。これを行う最善の方法について混乱しています。1) 1 対 1 の関係を介して User を拡張する、2) User テーブルで自己への再帰的な関係を使用する、3) を組み合わせて使用するようです。M2M リレーションシップに追加のフィールドを指定すると、モデルがどのように見えるかについて頭を悩ませることはできません。
これは私が現在これを達成している方法ですが、クエリごとにDBを2回通過する必要があるため、これは最善の方法ではないと思います。
models.py (疑似コード、Artist クラスがあると仮定):
class UserProfile(models.Model):
user = models.OneToOneField(User)
zipcode = models.CharField(max_length=16)
def create_user_profile(sender, instance, created, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)
class Score(models.Model):
user = models.ForeignKey(User, related_name='score_first_user')
second_user = models.ForeignKey(User, related_name='score_second_user')
dh_score = models.DecimalField(decimal_places=2, max_digits=5)
cre_date = models.DateTimeField(auto_now_add=True)
upd_date = models.DateTimeField(auto_now=True)
deleted = models.BooleanField()
class Meta:
unique_together = ('user', 'second_user')
class UserArtist(models.Model):
user = models.ForeignKey(User, related_name='userartist_first_user')
second_user = models.ForeignKey(User, related_name='userartist_second_user')
artist = models.ForeignKey(Artist)
cre_date = models.DateTimeField(auto_now_add=True)
upd_date = models.DateTimeField(auto_now=True)
deleted = models.BooleanField()
次に、views.py で (疑似コード) のようなものを使用して、スコアと一般的なアーティストを保存します。
s = Score(user=u, second_user=second_user score=dh_score)
s.save()
次のようなものを使用してそれらを取得します。
u = User.objects.get(username="%s" % username)
user_scores = Score.objects.filter( Q(user=u.id) | Q(second_user=u.id) ).order_by('-dh_score')[:10]
for user_score in user_scores:
# non-relevant logic to determine who is user and who is partner
...
partner_artists = UserArtist.objects.filter( (Q(user=u.id) & Q(second_user=partner.id))\
| (Q(user=partner.id) & Q(second_user=u.id))
)
これを達成するための最良の方法は何ですか?