14

我正在玩 Django/python 中的关系,我想知道你们如何在用户和他的追随者之间以及追随者与他追随的用户之间建立关系。

很想看看你的意见...

4

3 回答 3

26

首先,您应该了解如何存储有关用户的附加信息。它需要另一个与一个用户有关系的模型,即“个人资料”模型。

然后,您可以使用 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 回答