Django-rest框架从序列化程序继承一个类并使其成为abs

2024-09-27 20:19:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.6和django1.11.9和rest_framework3.6.2。在

我想继承序列化程序。序列化程序为了创建一个SharingSerializer类,我希望是抽象的,因为我想从后者继承来实现一些ArticleSharingSerializer,ImageSharingSerializer,。。。等等。在

我目前所做的努力:

from abc import ABCMeta, abstractmethod
from rest_framework import serializers
...

class SharingSerializer(serializers.Serializer, metaclass=ABCMeta):
    course = serializers.PrimaryKeyRelatedField(queryset=Course.objects.all())
    students = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), many=True)

    @abstractmethod
    def validate(self, data):
        # Doing validation stuff with "course" and "students" fields
        ...
        return data


class ArticleSharingSerializer(SharingSerializer):
    articles = serializers.PrimaryKeyRelatedField(queryset=Article.objects.all(), many=True)

    def validate(self, data):
        data = super().validate(data)
        # Doing validation stuff with "articles" and self.context["request"].user
        ...
        return data

但在尝试“运行服务器”时,我得到了以下错误:

^{pr2}$

你知道我怎样才能成功地实现我想要达到的目标吗?在

更新:我想利用ABC提供的@abstractmethod“强制”实例化。在

更新2:TLDR:ahmedhosny给出的最好答案是this link


Tags: fromself程序restdata序列化objectsall
1条回答
网友
1楼 · 发布于 2024-09-27 20:19:08

简短回答

要继续使用ABCMeta,您也可以这样做

class SharingSerializer(serializers.Serializer):
    __metaclass__ = ABCMeta

    course = serializers.PrimaryKeyRelatedField(queryset=Course.objects.all())
    students = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), many=True)

    @abstractmethod
    def validate(self, data):
        # Doing validation stuff with "course" and "students" fields
        ...
        return data

或者生成中间类,检查这个OP。在

长回答:

当您试图拥有一个继承自两个不同的meta_class的不同类的类时,会出现问题。然后冲突就发生了!在

所以在您的例子中,您继承了serializers.Serializer,它有一个元类(check this),而且您还继承了一个不同的meta_class,由metaclass=ABCMeta。这就是冲突发生的原因。在

还要检查这个reference,这个one。在

[更新]

让我们明确几点:

  • class Meta: abstract = True 不会像Java和其他编译语言那样使类抽象。

它实际做的只是用一些额外的属性来标记这个类(而不涉及更多细节)。在

所以它不是Django特有的,abstract = True单独没有任何东西也不会做任何额外的事情。在

相关问题 更多 >

    热门问题