Django rest framework writable nested serializer returns empty nested data

I follow this link ( http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers ) to write a nested serializer. But when I pop up "vars" from validated_data in the create HostSerializer method, I found it empty.

I am using django 1.9.2 and django restframework 3.3.2.

My model:

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

Serializer

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

This is a problem . I found that vars_data is an empty list:

  def create(self, validated_data):

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

Here is the rest of the code

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

My test program

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

And here is the test data

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. , - . ? URL? URL?

+4
1

...

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
0

All Articles