Как я могу сериализовать информацию через 3 таблицы в DRF? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть 3 таблицы (2 таблицы принадлежат 1 таблице с использованием ForeignKey).
Я мог бы создать набор запросов для 3 таблиц.Однако я не могу получить информацию таблицы именования из сериализованных возвращаемых данных, как показано ниже.
Может кто-нибудь сказать мне, как я должен пересмотреть сериализатор?

enter image description here 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')

1 Ответ

0 голосов
/ 30 ноября 2018

Создайте новый сериализатор, NamingNewSerializer и добавьте его в свой zoneSerializer, как показано ниже,

<b>class NamingNewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Naming
        fields = '__all__'</b>


class zoneSerializer(serializers.ModelSerializer):
    <b>namingzone = NamingNewSerializer(many=True)</b>

    class Meta:
        model = Zone
        fields = ('zone', 'conditioned', <b>'namingzone'</b>)

здесь namingzone - ключевое слово обратного отношения , которое используется для получения / получения Naming экземпляров из одного Zone instance.


Кроме того, я предлагаю вам следовать Соглашению CapWords при названии ваших классов:)

...