使用一对一关系序列化对象Django

时间:2015-05-30 16:08:17

标签: python django rest serialization django-rest-framework

我是django的新手。我正在休息api。我有一个可选的“是一种”关系,即学生是一名员工。我正在尝试序列化这两个模型,以便我得到json结果。如果有人能帮助我,请告诉我。感谢

class Employee(models.Model):
    full_name=models.CharField(max_length=100,blank=True)
    email_id=models.EmailField(max_length=100,blank=True)
    mobile_no=models.CharField(max_length=11,blank=True)
    is_job_ready=models.BooleanField(False)
    type=models.CharField(max_length=20,blank=True)
    location_preference=models.CharField(max_length=20,blank=True)

class Student(models.Model):
    college=models.CharField(max_length=100)
    year=models.CharField(max_length=20)
    is_with_college=models.BooleanField()
    employee=models.OneToOneField(Employee,primary_key=True)

2 个答案:

答案 0 :(得分:4)

Django REST framework有一些很好的工具可用于序列化嵌套对象。

你需要他们称之为Nested Relationship的东西。像这样 -

from rest_framework import serializers

# define your models here ...

class EmployeeSerializer(serializers.ModelSerializer):
  class Meta:
    model = Employee
    fields = ('full_name', 'email_id', 'mobile_no', 'is_job_ready', 'type', 'location_preference')

class StudentSerializer(serializers.ModelSerializer):
  employee = EmployeeSerializer(read_only = True)

  class Meta:
    model = Student
    fields = ('college', 'year', 'is_with_college', 'employee')

然后,您可以加载序列化程序并使用类似这样的内容 -

from myapp.models import StudentSerializer

student = Student.objects.first()
serializer = StudentSerializer(student)

serializer.data
# { 'college': 'Naropa University',
#    'is_with_college': True,
#    'year': '2015'}
#    'employee': {
#      'full_name' : 'Chogyam Trungpa',
#      'email_id' : 'teacher@naropa.edu',
#      'mobile_no' : '555-555-5555',
#      'is_job_ready' : True,
#      'type' :'Teacher',
#      'location_preference' : 'Boulder, CO'
#    }
#  }

答案 1 :(得分:1)

您可以使用 @metahamza 方式,或使用 depth 关键字引用文档 here

<块引用>

指定嵌套序列化 默认的 ModelSerializer 使用主键作为关系,但您也可以使用深度选项轻松生成嵌套表示:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        depth = 1
<块引用>

深度选项应设置为整数值,指示在恢复为平面表示之前应遍历的关系的 depth