我一直在使用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的链接,以便您进一步澄清:
答案 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())