django rest框架外键序列化器问题

时间:2016-06-02 09:45:09

标签: python json serializer

我是DJango Python webservices的新手,我遇到了序列化器的小问题。这是我的代码。

**views.py**
@csrf_exempt
@api_view(['GET'])
def sqlservice(request):
    if request.method == 'GET':
        posts = tbl_dcs.objects.all()
        for each in posts:
            manid = each.managerid_id
            manname = Managerid.objects.get(id = manid)
            nameser = managerSerializer(manname,many=False) 
            print nameser.data
        serializer = PostSerializer(posts, many=True)
        return Response({"resource":serializer.data}) 

**models.py**
from __future__ import unicode_literals
from django.db import models
class Managerid(models.Model):
    managername     =   models.CharField(max_length=25)
    def __unicode__(self):
        return self.managername
class tbl_dcs(models.Model):
    name        = models.CharField(max_length=25)
    location    = models.CharField(max_length=50)
    address     = models.TextField()
    managerid   = models.ForeignKey(Managerid,related_name='items')
    phonenumber = models.IntegerField()
    def __unicode__(self):
        return self.name

**serilizer.py**
from rest_framework import serializers
from mysqlservice.models import tbl_dcs
from mysqlservice.models import Managerid
class managerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Managerid
        fields = ('id', 'managername')  
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = tbl_dcs
        fields = ('id', 'name','location','address','managerid','phonenumber')

如果我运行上面的代码,结果就是......

{
  "resource": [
    {
      "id": 1,
      "name": "ramesh",
      "location": "hyd",
      "address": "kphb,hyd",
      "managerid": 10,
      "phonenumber": 345345
    },
    {
      "id": 2,
      "name": "kpti",
      "location": "kphb",
      "address": "kphb,6th phase,hyd",
      "managerid": 10,
      "phonenumber": 45456
    }
 ]
}

我生成的json我无法获取managername。如何从不同的表中获取基于managerid的managername?。如果我在任何地方错了,请纠正我。 我最后的json应该如下......

{
  "resource": [
    {
      "id": 1,
      "name": "ramesh",
      "location": "hyd",
      "address": "kphb,hyd",
      "managerid": 10,
      "phonenumber": 345345,
      "managername":"xxxxx"
    },
    {
      "id": 2,
      "name": "kpti",
      "location": "kphb",
      "address": "kphb,6th phase,hyd",
      "managerid": 10,
      "phonenumber": 45456,
      "managername":"yyyyy"
    }
 ]
}

1 个答案:

答案 0 :(得分:0)

使用serializers.SerializerMethodField获取经理名称,如下所示..

class PostSerializer(serializers.ModelSerializer):
    managername = serializers.SerializerMethodField('get_manager_name')

    class Meta:
        model = tbl_dcs
        fields = ('id', 'name','location','address','managerid','phonenumber','managername')

    def get_manager_name(self, obj):
        return obj.managerid.managername