Django REST Framework get value of foreign key

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, universitythe 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 @propertydecorator 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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325245346&siteId=291194637