加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django-rest-framework – django rest framework可写嵌套序列化

发布时间:2020-12-20 13:10:21 所属栏目:Python 来源:网络整理
导读:我正在关注此链接( http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers)来编写嵌套的序列化程序.但是当我在HostSerializer的create方法中从validated_data弹出’vars’时,我发现它是空的. 我正在使用django 1.9.2和dja
我正在关注此链接( 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))

串行

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的新手.所以我想知道它是否简单明了.我使用了错误的视图吗?我发布了错误的网址吗?或者我设置错误的URL结构?

解决方法

我的序列化器尝试使用…

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读