django rest framework可写嵌套序列化器返回空嵌套数据

时间:2016-02-28 19:38:01

标签: django-rest-framework

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

我使用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))

串行

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

这是问题我发现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')

这是代码的其余部分

admin.py

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)

urls.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)),
          ]

views.py

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

class HostViewSet(ModelViewSet):
  queryset = Host.objects.all()
  serializer_class = HostSerializer

我的测试程序

post.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

这是测试数据

host.json

{
"name": "host4",
"vars": [
    {
        "name": "var2-a",
        "value": "a1"
    },
    {
        "name": "var2-b",
        "value": "a2"
    }
],
"vm_cpu": 2,
"vm_mem": 2048,
"create_vm": true
}

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

1 个答案:

答案 0 :(得分: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
相关问题