从django-notifications-hq序列化NotificationQuerySet无效

时间:2015-04-21 13:19:58

标签: python django serialization notifications django-rest-framework

所以,我试图通过DRF(Django REST Framework)添加到我的API中的通知模型,但是我收到了这个错误:

AttributeError: 'NotificationQuerySet' object has no attribute 'recipient'

我正在尝试序列化django app模型,Notification。它来自这个应用程序:

https://github.com/django-notifications/django-notifications

我的ViewSet类是这样的:

class NotificationsViewSet(viewsets.ViewSet):
    serializer_class = NotificationsSerializer
    def list(self, request):
        queryset = Notification.objects.all()
        return Response(NotificationsSerializer(queryset).data)

这是我的序列化器:

class NotificationsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification
        fields = ('recipient','description')
        depth = 0

因此,当数据传递给序列化器时,它变为" Void"或没有任何数据。 在列表方法中执行类似操作:

print queryset[0]正常返回Notification对象。但是当将此查询集传递给序列化程序时,似乎为null,并且出现了AttributeError。

另外,尝试使用控制台:

notifications = Notification.objects.all()

返回 NotificationQuerySet 对象(可迭代)。然后我可以:

for noti in notifications:
    print noti

这将输出每个通知的所有 unicode 方法。 对于每个Notification实例,我也可以访问Model propierties:

for noti in notifications:
    print noti.recipient

效果很好。

将此传递给序列化程序时为什么不工作?它奇怪......

2 个答案:

答案 0 :(得分:1)

在使用查询集初始化序列化程序时,您需要传递many=True。如果您没有告诉它您正在传递多个对象,DRF将假设您正在传递单个对象并尝试直接从中获取字段。

答案 1 :(得分:0)

这里有一个完整的实现,自述文件留给drf

urls.py

...
import notifications.urls

urlpatterns = [
    ...
    path("inbox/notifications/", views.NotificationViewSet.as_view({'get': 'list'}), name='notifications'),
]

serializers.py

class UserSerializer(serializers.ModelSerializer):                           
    class Meta:                                   
        model = get_user_model()

class NotificationSerializer(serializers.Serializer):
    recipient = UserSerializer(read_only=True)
    unread = serializers.BooleanField(read_only=True)
    target = GenericNotificationRelatedField(read_only=True)
    verb = serializers.CharField()

views.py

from notifications.models import Notification
from .serializers import NotificationSerializer

NotificationViewSet(viewsets.ViewSet):
    serializer_class = NotificationSerializer

    def list(self, request):
        queryset = Notification.objects.all()
        return Response(NotificationSerializer(queryset, many=True).data)