Python 如何编写django rest框架序列化程序来保存包含泛型模型的嵌套层次结构?
我使用的是django 1.6和django rest框架2.4。我有一个与另一个模型有外键关系的通用模型。显然,通用模型可以与任何其他主机模型相关联。我希望能够一次性保存宿主模型和通用模型及其所有关联 例如: models.py: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
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序列化程序设置为只读,它仍然会删除它。这不能是设计的行为。