Python 如何编写django rest框架序列化程序来保存包含泛型模型的嵌套层次结构?

Python 如何编写django rest框架序列化程序来保存包含泛型模型的嵌套层次结构?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我使用的是django 1.6和django rest框架2.4。我有一个与另一个模型有外键关系的通用模型。显然,通用模型可以与任何其他主机模型相关联。我希望能够一次性保存宿主模型和通用模型及其所有关联 例如: models.py: from django.db import models from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation from django.contrib.c

我使用的是django 1.6和django rest框架2.4。我有一个与另一个模型有外键关系的通用模型。显然,通用模型可以与任何其他主机模型相关联。我希望能够一次性保存宿主模型和通用模型及其所有关联

例如:

models.py:

from django.db import models
from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType


class GenericItem(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    details = models.TextField(blank=True)


class GenericSubItem(models.Model):
    generic_item = models.ForeignKey(GenericItem, null=True, blank=True, related_name="sub_items")

    details = models.TextField(blank=True)


class Host(models.Model):
    details = models.TextField(blank=True)

    generic_items = GenericRelation(GenericItem, content_type_field='content_type', object_id_field='object_id')
serializers.py:

from rest_framework import serializers
from . import models


class GenericSubItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.GenericSubItem
        fields = ('id', 'details', )


class GenericItemSerializer(serializers.ModelSerializer):
    sub_items = GenericSubItemSerializer(many=True, required=False, allow_add_remove=True)

    class Meta:
        model = models.GenericItem
        fields = ('id', 'details', 'sub_items', )


class HostSerializer(serializers.ModelSerializer):
    generic_items = GenericItemSerializer(many=True, required=False, allow_add_remove=True)

    class Meta:
        model = models.Host
        fields = ('id', 'details', 'generic_items', )
views.py:

from rest_framework import viewsets
from . import serializers, models


class HostView(viewsets.ModelViewSet):
    queryset = models.Host.objects.all()
    serializer_class = serializers.HostSerializer
这里的问题是,即使子_项已发布,也不会保存它们。更糟糕的是,如果通过shell添加子项,它将显示得很好,但保存时,子项将被删除

如何编写序列化程序,以便保存主机将保存其他所有内容

谢谢


Paul

您能详细介绍一下您的观点吗?或者,您可以尝试覆盖GenericItemSerializer中的createself、已验证的\u数据,如下所示:

class GenericItemSerializer(serializers.ModelSerializer):
    sub_items = GenericSubItemSerializer(many=True, required=False, allow_add_remove=True)

    class Meta:
        model = models.GenericItem
        fields = ('id', 'details', 'sub_items', )

    def create(self, validate_data):
        subitemdata = validate_data.pop('sub_items')
        subitemobj = GenericSubItem.objects.create(**subitemdata)
        GenericItem.objects.create(sub_items=subitemobj, **validate_data)

谢谢你的建议,我不知道序列化程序有一个create。我已经用views.py更新了我的原始问题,它只是一个rest框架视图集。有人能确认这是否是一个bug吗?即使我将sub_items序列化程序设置为只读,它仍然会删除它。这不能是设计的行为。