django rest 框架可写嵌套序列化程序返回空嵌套数据

you*_*ong 5 django-rest-framework

我正在关注此链接(http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers)来编写嵌套序列化程序。但是当我在 HostSerializer 的 create 方法中从validated_data 中弹出'vars' 时,我发现它是空的。

我正在使用 django 1.9.2 和 django restframework 3.3.2。

我的型号:

class Host(models.Model):

  name = CharField(max_length=20, primary_key=True)
  vm_cpu = IntegerField(default=2)
  vm_mem = IntegerField(default=2048)
  create_vm = BooleanField(default=True)

  def __unicode__(self):
    return('%s' % (self.name))

class Variable(models.Model):

  name = CharField(max_length=10)
  value = CharField(max_length=20)
  host = models.ForeignKey(Host, related_name='vars')

  def __unicode__(self):
    return('%s=%s' % (self.name, self.value))
Run Code Online (Sandbox Code Playgroud)

序列化器

class VariableSerializer(ModelSerializer):

  class Meta:
    model = Variable

class HostSerializer(ModelSerializer):        

  vars = VariableSerializer(many=True)

  class Meta:
    model = Host

  def create(self, validated_data):

    # i set a break point here and found vars_data is empty
    vars_data = validated_data.pop('vars')
    host = Host.objects.create(**validated_data)
    for v in vars_data:
        Variable.objects.create(host = host, **v)

    return host
Run Code Online (Sandbox Code Playgroud)

这是我发现 vars_data 是一个空列表的问题:

  def create(self, validated_data):

    # i set a break point here and found vars_data is empty
    vars_data = validated_data.pop('vars')
Run Code Online (Sandbox Code Playgroud)

这是其余的代码

管理文件

class VariableAdmin(admin.ModelAdmin):
  list_display = ['name', 'value']

class HostAdmin(admin.ModelAdmin):    
  list_display = ['name']


admin.site.register(Variable, VariableAdmin)
admin.site.register(Host, HostAdmin)
Run Code Online (Sandbox Code Playgroud)

网址.py

router = DefaultRouter()
router.register(r'variables', VariableViewSet, base_name='variables')
router.register(r'hosts', HostViewSet, base_name='hosts')

urlpatterns = [
          url(r'^', include(router.urls)),
          ]
Run Code Online (Sandbox Code Playgroud)

视图.py

class VariableViewSet(ModelViewSet):
  queryset = Variable.objects.all()
  serializer_class = VariableSerializer

class HostViewSet(ModelViewSet):
  queryset = Host.objects.all()
  serializer_class = HostSerializer
Run Code Online (Sandbox Code Playgroud)

我的测试程序

后.py

import json
import requests

file = 'host.json'
url = 'http://localhost:8001/test_nest/hosts/'

with open(file, 'r') as f:
  j = f.read()

data = json.loads(j)

r = requests.post(url, data = data)
print r.text
Run Code Online (Sandbox Code Playgroud)

这是测试数据

主机文件

{
"name": "host4",
"vars": [
    {
        "name": "var2-a",
        "value": "a1"
    },
    {
        "name": "var2-b",
        "value": "a2"
    }
],
"vm_cpu": 2,
"vm_mem": 2048,
"create_vm": true
}
Run Code Online (Sandbox Code Playgroud)

我是 Django 的新手。所以我想知道它是否简单而明显。我是否使用了错误的视图集?我发错了网址吗?或者我设置的 URL 结构错误?

Amr*_*rit 0

我你的序列化器尝试使用...

def update(self, instance,validated_data):

    instance.vars_data = validated_data.get('vars',instance.vars)
    instance.host = Host.objects.create(**validated_data)
    for v in vars_data:
        v,created=Variable.objects.create(host = host, **v)
        instance.v.add(v)

    return host
Run Code Online (Sandbox Code Playgroud)