Problem: foreign key serialization, showing only id instead of content
There are two models, one model is University, which contains the field name. The other is Student. There is a foreign key university in Student that points to the University model. If you write the field in the Meta class directly when serializing the Student model, university
the result is the id in University, not the corresponding name.
Therefore, two methods are used here to obtain the field value in the foreign key, that is, to get the name in the University.
The problem code is as follows:
core/models.py
from django.db import models
class University(models.Model):
name = models.CharField(max_length=50)
class Meta:
verbose_name = "University"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
university = models.ForeignKey(University,
on_delete=models.CASCADE)
class Meta:
verbose_name = "Student"
verbose_name_plural = verbose_name
def __str__(self):
return "{0} {1}".format(self.first_name, self.last_name)
Serialize core/serializers.py
from rest_framework import serializers
from .models import University, Student
class UniversitySerializer(serializers.ModelSerializer):
class Meta:
model = University
fields = ('name')
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ('university', 'first_name', 'last_name')
the first method:
When serializing, a new field called university_name is created, specified as serializers.CharField
, and the field uses the source attribute. Specifically, the format is:
CharField(source='<本model中的外键>.<外键指向的model的相应属性>')
core/models.py
from django.db import models
class University(models.Model):
name = models.CharField(max_length=50)
class Meta:
verbose_name = "University"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
university = models.ForeignKey(University,
on_delete=models.CASCADE)
class Meta:
verbose_name = "Student"
verbose_name_plural = verbose_name
def __str__(self):
return "{0} {1}".format(self.first_name, self.last_name)
core/serializers.py
useCharField(source='<本model中的外键>.<外键指向的model的相应属性>')
from rest_framework import serializers
from .models import University, Student
class UniversitySerializer(serializers.ModelSerializer):
class Meta:
model = University
fields = ('name')
class StudentSerializer(serializers.ModelSerializer):
university_name = serializers.CharField(source='university.name')
class Meta:
model = Student
fields = ('university_name', 'first_name', 'last_name')
The second method:
This method is relatively more complicated,
- First, the
@property
decorator first creates a
university_name function, which returns the corresponding field of the model corresponding to the foreign key, such as university.name. - Then, when serializing, specify the
serializers.ReadOnlyField()
type .
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
university = models.ForeignKey(University,
on_delete=models.CASCADE)
class Meta:
verbose_name = "Student"
verbose_name_plural = verbose_name
def __str__(self):
return "{0} {1}".format(self.first_name, self.last_name)
@property
def university_name(self):
return self.university.name
useReadOnly()
from rest_framework import serializers
from .models import University, Student
class UniversitySerializer(serializers.ModelSerializer):
class Meta:
model = University
fields = ('name')
class StudentSerializer(serializers.ModelSerializer):
university_name = serializers.ReadOnlyField()
class Meta:
model = Student
fields = ('university_name', 'first_name', 'last_name')
refer to
Retrieving a Foreign Key value with django-rest-framework serializers