Django REST框架:按当前登录的所有者筛选嵌套对象
我正在尝试按当前授权用户的所有权筛选API响应中的嵌套对象 以下是我的设置: Django 1.8,Django REST框架3 模型 序列化程序 DRF视图 不同的用户可以为同一容器创建通知对象 如果我取消对通知的注释,以获取容器=NotificationSerializerName=True,我将得到:Django REST框架:按当前登录的所有者筛选嵌套对象,django,django-rest-framework,Django,Django Rest Framework,我正在尝试按当前授权用户的所有权筛选API响应中的嵌套对象 以下是我的设置: Django 1.8,Django REST框架3 模型 序列化程序 DRF视图 不同的用户可以为同一容器创建通知对象 如果我取消对通知的注释,以获取容器=NotificationSerializerName=True,我将得到: "data": [ { "notifications_for_container": [ { "pk": 11,
"data": [
{
"notifications_for_container": [
{
"pk": 11,
"owner": 2,
},
{
"pk": 20,
"owner": 46,
}
],
"pk": 6,
"container_title": "TEST CONTAINER",
"all_items_in_holder": [
{
"pk": 12,
"item_title": "xbox1 from amazon ",
},
]
}
]
无论我当前使用哪个用户登录
我在这里试图实现的是,在API响应的notifications_for_容器部分中只返回所有者的通知
例如,如果我以pk=2的用户身份登录,我应该只获得
"data": [
{
"notifications_for_container": [
{
"pk": 11,
"owner": 2,
}
]
...
...
我一直在尝试从实现解决方案,但在/api/containers/'request'处出现了KeyError
我已经尝试解决这个问题两天了,也许我没有看到明显的问题,所以任何帮助都将不胜感激。
提前谢谢 代码的问题似乎是上下文属性没有被当前请求填充。看一看。也许你应该做一些类似的事情:
serializer = ContainerSerializer(many=True, context={'request': request})
第一:
或
第二:
def get_current_user_notifications(self, obj):
user = self.context['request'].user
# user_notifications is a queryset
user_notifications = Notification.objects.filter(item_to_track=obj, owner=user)
# so you need add many=True
serializer = NotificationSerializer(user_notifications, many=True)
return serializer.data
很难说,语句serializer=NotificationSerializerForItemsHolderuser\u通知包含在哪个文件中?是否可以发布完整的回溯?对不起,我的错误,以下是完整的错误文本:试图获取序列化程序“NotificationSerializer”上字段“owner”的值时,位于/api/containers/get AttributeError的AttributeError。序列化程序字段的名称可能不正确,并且与“QuerySet”实例上的任何属性或键都不匹配。最初的异常文本是:“QuerySet”对象没有属性“owner”。也许您应该尝试将source='owner.pk'更改为source='pk'Nope,这没有帮助。在线serializer=NotificationSerializerForItemsHolderuser_通知上它肯定失败了,但我不明白为什么。我在回溯中得到了这个:列表107中的myproj/api_app/views.py。data=get\u current\u user\u通知101中的new\u serializer.data myproj/api\u app/serializers.py。return serializer.dataTry使用完整回溯更新问题。根据您发布的信息复制问题是一项艰巨的工作,我没有时间,老实说,我有意愿正确地执行此操作,但如果您用它更新您的问题,我可以查看完整的跟踪。
"data": [
{
"notifications_for_container": [
{
"pk": 11,
"owner": 2,
}
]
...
...
serializer = ContainerSerializer(many=True, context={'request': request})
serializer = ContainerSerializer(many=True, context={'request': request})
serializer = ContainerSerializer(many=True, context=self.get_serializer_context())
def get_current_user_notifications(self, obj):
user = self.context['request'].user
# user_notifications is a queryset
user_notifications = Notification.objects.filter(item_to_track=obj, owner=user)
# so you need add many=True
serializer = NotificationSerializer(user_notifications, many=True)
return serializer.data