0

私の環境は、Django 1.10に基づいています。PostgreSQL 9.5と;PostgreSQLマルチテーブルモデルのシリアライザとViewSet継承?

私は親テーブルから継承する子テーブルを持っています。それぞれについて、私はそれぞれの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のための1:

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']) 

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) 

それはシリアライザおよびビューセットの中からの継承を持つことが可能です:

したがって、私は3つのビューセット、各シリアライザのための1つを作ったのですか?私は前の例を試しましたが、新しいChildModelをPOSTしようとするたびに、すべてのParentModelフィールドにNULL値があることを示す例外がスローされます(ChildModelフィールドのフィールドを除く)。

+0

シリアライザとビューセットの間で継承が可能ですか?あなたが望むデータ形式を投稿してください。 – Windsooon

答えて

0

それは継承されていませんが、あなたはこのような操作を行うことができます。

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

はそれ、私はそれを行う方法です。