【问题标题】:Serializers and ViewSets inheritance of PostgreSQL multitable models?PostgreSQL 多表模型的序列化器和视图集继承?
【发布时间】:2017-01-08 17:03:38
【问题描述】:

我的环境基于 Django 1.10 & PostgreSQL 9.5 和;

我有一个继承自父表的子表。对于每一个,我分别有一个 Django 模型类 ChildModel 和 ParentModel:

class ParentModel(models.Model):
    id = models.AutoField(primary_key=True)
    owner = models.ForeignKey('auth.User', related_name='parents')

    class Meta:
        managed = False
        db_table = 'parenttable'


class ChildModel(ParentModel):
    name = models.CharField(unique=True, max_length=255)
    abbreviation = models.CharField(unique=True, max_length=2)

    class Meta:
        managed = False
        db_table = 'childtable'

然后,我为其中的每一个制作了一个序列化程序,并为 django.contrib.auth.models.User 制作了一个序列化程序:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    parents = serializers.PrimaryKeyRelatedField(many=True, queryset=ParentModel.objects.all())

    class Meta:
        model = User
        fields = (['id', 'username', 'parents'])


class ParentModelSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.IntegerField(source='parent.id', read_only=True, allow_null=False)

    class Meta:
        model = ParentModel
        fields = (['id', 'owner'])


class ChildModelSerializer(ParentModelSerializer):
    class Meta:
        model = ChildModel
        fields = (['name', 'abbreviation'])

因此,我制作了三个 ViewSet,每个序列化器一个:

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class ParentModelViewSet(viewsets.ModelViewSet):
    queryset = ParentModel.objects.all()
    serializer_class = ParentModelSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwnerOrReadOnly)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


class ChildModelViewSet(ParentModelViewSet):
    queryset = ChildModel.objects.all()
    serializer_class = ChildModelSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwnerOrReadOnly)

是否可以从序列化程序和视图集之间继承?我尝试了前一个示例,但每次尝试发布新的 ChildModel 时,都会引发异常,显示所有 ParentModel 字段都有 NULL 值(ChildModel 字段中的那些除外)。

【问题讨论】:

  • 是否可以从序列化器和视图集之间继承?请发布您想要的数据格式。

标签: python django postgresql django-models django-rest-framework


【解决方案1】:

这不是继承,但你可以这样做:

class ChildModelSerializer(ParentModelSerializer):
    class Meta:
        model = ChildModel
        fields = ParentModelSerializer.Meta.fields + ['name', 'abbreviation']

我就是这样做的。

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 2014-07-25
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多