如何在DRF中的3个表之间序列化信息? [英] How I can serialize information across 3 tables in DRF?
问题描述
我有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屋!