0

我一直在使用django-relationships来允许用户互相关注。如果鲍勃跟随乔。Bob 将能够看到 Joe 的所有照片。但是,如果 Bob 屏蔽了 John,John 将不是 Bob 的照片。

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

假设摄影师是用户的 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 中生成两个表,下表是关系关系表:

    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"

另一个表是关系关系状态表:

    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 的链接,以便您进一步了解:

模型.py

4

2 回答 2

2

在我看来,您只需要一个.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())

如果 Bob 阻止了 John,这将阻止 Bob 看到 John 的照片。鉴于 Bob 只在 Bob 关注 John 时才能看到 John 的照片,除非 Bob 同时关注并阻止 John,否则它不会做任何事情,这对我来说似乎很奇怪 - 如果 John 阻止 Bob,您是否希望 Bob 看不到 John 的照片?如果是这样:

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())
于 2013-05-10T18:00:13.113 回答
1

创建自定义管理器。取决于您是选择用户可以看到的所有照片,还是选择允许您查看其照片的所有用户,这对您是否需要RelationshipManagerPhotosManager 有所不同。我假设您想要照片提要 - 您可以调整它以使用一些 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仅作说明之用。

于 2013-05-10T14:00:45.033 回答