我使用的是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
简短回答
要继续使用
ABCMeta
,您也可以这样做或者生成中间类,检查这个OP。在
长回答:
当您试图拥有一个继承自两个不同的
meta_class
的不同类的类时,会出现问题。然后冲突就发生了!在所以在您的例子中,您继承了
serializers.Serializer
,它有一个元类(check this),而且您还继承了一个不同的meta_class
,由metaclass=ABCMeta
。这就是冲突发生的原因。在还要检查这个reference,这个one。在
[更新]
让我们明确几点:
做
class Meta: abstract = True
不会像Java和其他编译语言那样使类抽象。它实际做的只是用一些额外的属性来标记这个类(而不涉及更多细节)。在
abstract
的味道。在这里检查Django源代码https://github.com/django/django/blob/master/django/db/models/base.py#L62所以它不是Django特有的,
abstract = True
单独没有任何东西也不会做任何额外的事情。在ABC
正在做一个类似的想法,用额外而简洁的方式来拥有{相关问题 更多 >
编程相关推荐