所以,我试图通过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
效果很好。
将此传递给序列化程序时为什么不工作?它奇怪......
答案 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)