如何使用djangrelationships实现阻塞?

2024-04-20 16:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用django-relationships来允许用户互相跟踪。如果鲍勃跟着乔。鲍勃可以看到乔的所有照片。但是如果鲍勃挡住了约翰,约翰就不会是鲍勃的照片。在

我的问题是我不知道如何限制被阻止用户的内容。我看过这些例子,但似乎还是找不到解决办法。在

假设摄影师是用户的FK

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

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\u relationships表:

^{pr2}$

另一个表是relationships\u 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关系的链接模型.py以便进一步澄清:

models.py


Tags: 用户nameid内容getobjectrequest资源
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())

如果鲍勃挡住了约翰,这将阻止鲍勃看到约翰的照片。考虑到鲍勃只有在鲍勃跟踪约翰的情况下才会看到约翰的照片,除非鲍勃同时跟踪并阻止约翰,否则它什么都不会做,这在我看来很奇怪——如果约翰在阻止鲍勃,你是否希望鲍勃不看约翰的照片?如果是:

^{pr2}$

创建自定义管理器。取决于您是选择用户可以看到的所有照片还是允许您查看其照片的所有用户决定您是否需要关系管理器还是PhotosManager。我假设你想要一个照片的feed-你可以调整它来限制用户很容易使用一点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()

现在,您可以获得视图中未被阻止的照片列表:

^{pr2}$

编辑:

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

相关问题 更多 >