Django5—關聯字段序列化(父表獲取從表字段、從表獲取父表字段信息)


父表:Project

從表:Interface

 

1.  父表獲取從表字段 : 使用從表模型類名小_set

a. 父表模型對象獲取從表的數據,默認使用從表模型類名小_set

b.在父表序列化器中,可以手動指定關聯字段的序列化類型

c.PrimaryKeyRelatedField,指定從表的主鍵id值

d.PrimaryKeyRelatedField指定read_only=True,那么只輸出從表外鍵id

e.如果未指定read_only=True或者required=False,那么必須得指定queryset(指定校驗時使用的查詢集對象)

 interfaces_set = serializers.PrimaryKeyRelatedField(label='所屬接口的id', help_text='所屬接口的id',many=True, read_only=True)

 interfaces_set = serializers.PrimaryKeyRelatedField(label='所屬接口的id', help_text='所屬接口的id', many=True,queryset=Interfaces.objects.all())

 

 2.  父表獲取從表字段 : 使用related_name

  在定義外鍵字段時,可以指定related_name參數,用於設置父表模型對象獲取從表數據時,使用的屬性名稱(不指定的話默認 從表小寫_set)

interfaces/models.py 
projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, related_name='interfaces')

 projects/serializers.py

interfaces = serializers.PrimaryKeyRelatedField(label='所屬接口的id', help_text='所屬接口的id',  many=True, queryset=Interfaces.objects.all())

 

3. StringRelatedField

StringRelatedField用於在序列化輸出時,調用關聯模型類中的__str__方法

StringRelatedField默認添加了read_only=True,只用於序列化輸出,而不會反序列化輸入

interfaces = serializers.StringRelatedField(label='所屬接口名稱', help_text='所屬接口名稱', many=True)

 

4. SlugRelatedField

SlugRelatedField用於在序列化輸出或者反序列化輸入時,指定使用的關聯模型類中的字段名

如果未指定read_only=True或者required=False,那么必須得指定queryset(指定校驗時使用的查詢集對象)

如果需要反序列化輸入,那么slug_field必須得指定擁有唯一約束的字段名

interfaces = serializers.SlugRelatedField(label='所屬接口名稱', help_text='所屬接口名稱', many=True,
                                              slug_field='tester', queryset=Interfaces.objects.all())

 

5. 父表獲取從表所有信息 / 從表獲取父表所有信息

  定義一個序列化器類,指定要返回的父表字段,然后將這個序列化器類作為子表Serializer中的字段即可;從表同理

子表Serializer中的字段:命名用子表模型中的外鍵名

父表Serializer中的字段:命名用related_name 或 從表模型類名小寫_set

 

從表中返回父表字段

interfaces/serializers.py from rest_framework import serializers
from projects.models import Projects

class OneProjectsSerializer(serializers.Serializer): """ 定義一個序列化器類,指定要返回的父表字段 """ id = serializers.IntegerField() name = serializers.CharField() leader = serializers.CharField() is_execute = serializers.BooleanField() desc = serializers.CharField() create_time =serializers.DateTimeField() update_time = serializers.DateTimeField() class InterfacesSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='id主鍵', help_text='id主鍵', required=False)
    name = serializers.CharField(label='接口名稱', help_text='接口名稱', max_length=15,
                                 error_messages={'max_length': 'name不能超過15字'})
    tester = serializers.CharField(label='測試人員', help_text='測試人員', max_length=10,
                                   error_messages={'max_length': 'tester不能超過15字'})
    create_time = serializers.DateTimeField(label='創建時間', help_text='創建時間', required=False, read_only=True)
    update_time = serializers.DateTimeField(label='更新時間', help_text='更新時間', required=False, read_only=True)
    # projects = serializers.StringRelatedField(label='所屬項目名稱', help_text='所屬項目名稱')
    # projects = serializers.PrimaryKeyRelatedField(queryset=Projects.objects.all(), label='項目id', help_text='項目id')
    projects = OneProjectsSerializer(label='獲取父表projects所有信息',help_text='獲取父表projects所有信息',read_only=True) 

interfaces/models.py from django.db import models

class Interfaces(models.Model):
    id = models.AutoField(primary_key=True, verbose_name='id主鍵', help_text='id主鍵')
    name = models.CharField(verbose_name='接口名稱', help_text='接口名稱', max_length=15, unique=True)
    tester = models.CharField(verbose_name='測試人員', help_text='測試人員', max_length=10)
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='創建時間', help_text='創建時間')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間', help_text='更新時間')
    projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, related_name='interfaces') 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM