多态性模型序列化器



我正在使用设置通知的多态性模型:

我的模型:

class Notification(PolymorphicModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_by = models.ForeignKey(ElsUser, on_delete=models.CASCADE, default=None, related_name="creatednotifications")
    created_on = models.DateTimeField(default=timezone.now)
    created_for = models.ForeignKey(ElsUser, on_delete=models.CASCADE, default=None, related_name="receivednotifications")
    read = models.DateTimeField(default=None, null=True, blank=True)
    message = models.CharField(default=None, blank=True, null=True, max_length=800)
    @property
    def total(self):
        return self.objects.filter(created_for=self.request.user).count()
    @property
    def unread(self):
        return self.objects.filter(created_for=self.request.user,read=None).count()
    @property
    def read(self):
        return self.objects.filter(created_for=self.request.user).exclude(read=None).count()    
class WorkflowNotification(Notification):
    # permission_transition = models.ForeignKey(WorkflowStatePermissionTransition, on_delete=models.CASCADE)
    action = models.ForeignKey(UserAction, on_delete=models.CASCADE)

目前,我只有一种从多态模型继承的模型工作流动化,但将来会有许多模型。

我试图获取API中登录的用户的计数(总数)。

我的序列化器:

class NotificationSerializer(serializers.ModelSerializer):
    total = serializers.ReadOnlyField()
    read = serializers.ReadOnlyField()
    unread = serializers.ReadOnlyField()
    class Meta:
        model = Notification
        fields = ['id', 'total','read', 'unread']

在视图中:

   class NotificationsMeta(generics.ListAPIView):
    serializer_class = NotificationSerializer
    queryset = Notification.objects.all()

当我尝试运行服务器时,它显示:

  Got AttributeError when attempting to get a value for field `total` on serializer `NotificationSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `WorkflowNotification` instance.
Original exception text was: Manager isn't accessible via WorkflowNotification instances.

由于您仅需要'元数据',因此制作模型序列化器有什么用?还是任何序列化器?连续化器将为您提供模型对象的序列化实例。因此,如果您有多个对象,则会在响应中获得多个序列化对象。

只需使您的视图成为普通的概论。由于不必序列化任何东西。

class NotificationsMeta(APIView):
    def get(self, request, format=None):
        qs = Notification.objects.filter(created_for=self.request.user)
        response = {
            'total': qs.count(),
            'read': qs.filter(read=None).count(),
            'unread': qs.exclude(read=None).count()
        }
        return Response(response)

现在从模型中删除这些属性功能。

我没有测试您的查询,只是从模型中复制了它们。您将需要检查它们是否正常工作。希望这会有所帮助。

我不确定如何调用负责模型中查询的模型属性可以从序列化器提供适当的数据。不幸的是,我确实对此有差距。我正在考虑另一种解决方案。我希望关注应该起作用。

class NotificationSerializer(serializers.ModelSerializer):
    total = serializers.serializers.SerializerMethodField()
    read = serializers.ReadOnlyField()
    unread = serializers.ReadOnlyField()
    class Meta:
        model = Notification
        fields = ['read', 'unread']

    def get_total(self, obj):
        user =  self.context['request'].user 
        return Notification.objects.filter(created_for=user).count()

如果这项工作,那么您也可以做类似的事情来阅读和未阅读。

为了获得current_user的通知,我们需要从视图中覆盖get_queryset。

   class NotificationsMeta(generics.ListAPIView):
    serializer_class = NotificationSerializer
    def get_queryset(self):
       return Notification.objects.filter(created_for=self.request.user)

最新更新