如何使用Django关系实现阻止?

时间:2013-05-07 18:49:04

标签: python django tastypie blocking relationships

我一直在使用django-relationships来允许用户互相关注。如果鲍勃跟随乔。鲍勃将能够看到乔的所有照片。然而,如果鲍勃阻止约翰,约翰将不会是鲍勃的照片。

我的问题是我不知道如何限制被阻止用户的内容。我已经看过这些例子,但我似乎仍无法找到解决方案。

假设摄影师是用户的FK

以下是我的FollowPhoto资源(此资源会返回属于该用户所关注人员的所有照片):

FollowingPhoto(ModelResource):
     photographer = fields.ForeignKey(PhotographerResource, 'photographer', full=True)
     class Meta:
          queryset = Photo.objects.all().order_by('-postTime')
          resource_name = 'following'
          fields = ['id', 'title', 'url', 'likes','postTime','photographer', 'location_id', 'location_name']
          authentication = BasicAuthentication()
          authorization = DjangoAuthorization()
          serializer = Serializer(formats=['json'])
          include_resource_uri = False
          filtering = {
                 'postTime': ALL,
                 'photographer' : ALL_WITH_RELATIONS,


         }

     def get_object_list(self, request):
             return super(FollowingPhoto, self).get_object_list(request).filter(photographer__user__in = request.user.relationships.following())

现在您可能已经注意到我的get_object_list,它会返回我所关注的用户的所有内容。如何防止被阻止的用户出现在此列表中?

Django-relationships应用程序在postgresql中生成两个表,下表是relationships_relationships表:

    id       from_user    to_user_id   status_id            created
[PK] serial   integer      integer                         timestamp
    6            1            5           1         2012-10-05 20:10:29.848667+00"
    7            1            3           1         2012-10-05 20:11:23.319961+00"

另一个表是relationships_relationshipstatus表:

    id          name          verb         from_slug        login_required   private
[PK] serial   character     character   character varying      boolean       boolean
    1         Following      follow         friends             FALSE         FALSE
    2         Blocking        block         !                   TRUE          TRUE

下面我添加了Django-relationships models.py的链接,以便您进一步澄清:

models.py

2 个答案:

答案 0 :(得分:1)

创建自定义管理器。取决于您是选择用户可以看到的所有照片还是所有用户,您可以看到哪些照片会影响您是否需要 RelationshipManager < / strong>或 PhotosManager 。我假设你想要一个照片供给 - 你可以调整这个来限制用户很容易用一些sql。

PhotosManager(models.Manager):
    def get_unblocked(self, user):
        sql = """SELECT myapp_photo.* 
            FROM myapp_photo
            INNER JOIN auth_user
                ON myapp_photo.user_id = auth_user.id
            WHERE auth_user.id != %d /*DO NOT SHOW YOUR OWN PHOTOS*/
            AND myapp_photo.user_id NOT IN(
                SELECT myapp_blocked.blocked_user_id
                FROM myapp_blocked
                WHERE myapp_blocked.user_id = %d
            )""" % (user.pk, user.pk)

        return self.model.objects.raw(sql)

为可怕的sql道歉,我不知道你的表结构我只想说明一点

然后在照片模型中添加objects = PhotosManager()

现在,您可以获得未在视图中屏蔽的照片列表:

Photos.objects.get_unblocked(request.user)

编辑:

我刚刚意识到我的代码只考虑阻止用户而非关注者。再次不知道你的桌子结构,我只是猜测。您可以添加另一个AND myapp_photo.user_id IN(子句,仅允许来自以下用户的照片。此外,你可以肯定地编写更好的sql,这是一个快速而肮脏的例子。我的解决方案:编写一个管理器,实际提供的sql仅用于说明目的。

答案 1 :(得分:1)

在我看来,你只需要一个.exclude子句 - 类似于:

def get_object_list(self, request):
     return super(FollowingPhoto, self).get_object_list(request).filter(photographer__user__in = request.user.relationships.following()).exclude(photographer__user__in=request.user.relationships.blocking())
如果鲍勃阻止约翰,这将阻止鲍勃看到约翰的照片。鉴于鲍勃只看到约翰的照片,如果鲍勃跟随约翰,除非鲍勃跟随并阻挡约翰,否则它什么也不会做,这对我来说似乎很奇怪 - 你是否希望鲍勃不看约翰的照片,如果约翰阻止鲍勃?如果是这样的话:

def get_object_list(self, request):
    return super(FollowingPhoto, self).get_object_list(request).filter(photographer__user__in = request.user.relationships.following()).exclude(photographer__user__in=request.user.relationships.blockers())