如何在DRF中的3个表之间序列化信息? [英] How I can serialize information across 3 tables in DRF?

查看:333
本文介绍了如何在DRF中的3个表之间序列化信息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3个表(其中2个表使用ForeignKey属于1个表)。

我可以跨3个表创建queryset。但是,无法从如下所示的序列化返回数据中获取表信息的名称。

谁能告诉我如何修改序列化程序?

I have 3 tables(2 tables are belonging to 1 table using ForeignKey).
I could create queryset across 3 tables. However, I cannot get naming table information from serialized return data as below.
Could anyone tell me how I should revise serializer?


views.py

class lightData(generics.ListAPIView):
    serializer_class = lightSerializer
    pagination_class = None

    def get_queryset(self):
        certificate = self.kwargs['certificate']
        return Light.objects.prefetch_related('zone__namingzone')

models.py

class Zone(models.Model):
    zone=models.CharField(max_length=20)
    conditioned=models.BooleanField(default=True)

    def __str__(self):
        return self.zone

class Light(models.Model):
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='lightzone')
    lpd=models.IntegerField()
    sensor=models.BooleanField(default=True)

    class Meta:
        unique_together = (('certificate', 'zone'),)

    def __str__(self):
        return str(self.certificate)+"_"+str(self.zone)

class Naming(models.Model):
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='namingzone')
    naming=models.CharField(max_length=20)

    def __str__(self):
        return str(self.zone)+"_"+self.naming

serializer.py

from rest_framework import serializers
from .models import Certificate,Zone,Light,OA,Naming

class zoneSerializer(serializers.ModelSerializer):

    class Meta:
        model=Zone
        fields = ('zone','conditioned')

class lightSerializer(serializers.ModelSerializer):
    zone = zoneSerializer()

    class Meta:
        model=Light
        fields = ('zone','lpd','sensor')

class namingSerializer(serializers.ModelSerializer):
    zone=zoneSerializer()

    class Meta:
        model=Naming
        fields=('zone','naming')


推荐答案

创建新的序列化程序, NamingNewSerializer 并将其添加到您的 zoneSerializer 内,如下所示,

Create a new serializer, NamingNewSerializer and add it inside your zoneSerializer as below,

class NamingNewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Naming
        fields = '__all__'


class zoneSerializer(serializers.ModelSerializer):
    namingzone = NamingNewSerializer(many=True)

    class Meta:
        model = Zone
        fields = ('zone', 'conditioned', 'namingzone')






此处为 命名区域 反向关系关键字 ,用于获取/获取 命名 实例,来自单个 Zone 实例。


here the namingzone is the reverse relation keyword which is used to fetch/get Naming instances from a single Zone instance.

除此之外,建议您遵循 CapWords约定 ,同时为您的课程命名:)

Apart from that, I suggest you to follow the CapWords convention while name your classes :)

这篇关于如何在DRF中的3个表之间序列化信息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆