DRF с использованием prefetch_related

У меня есть два класса Vessels и Components, у каждого судна есть несколько компонентов. Я просто хочу получить все суда и все связанные с ними компоненты в одном запросе, я думал, что prefretch_related делает этот трюк, но в DRF в api я получаю только суда без связанных с ними компонентов

models.py

class Vessel(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    imo = models.CharField(max_length=255, null=True, blank=True)

    def __str__(self):
        return self.name

class Component(models.Model):
    vessel = models.ForeignKey(
        Vessel, blank=True, null=True, on_delete=models.CASCADE, related_name='vessel_components')
    name = models.CharField(max_length=200, blank=True, null=True)
    manufacturer = models.CharField(max_length=200, blank=True, null=True)
    model = models.CharField(max_length=200, blank=True, null=True)
    type = models.CharField(max_length=200, blank=True, null=True)
    remarks = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.name

serializers.py

class VesselSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vessel
        fields = '__all__'
class ComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Component
        fields = '__all__'

взгляд :

@api_view(['GET'])
def getVessels(request):
    vessels = Vessel.objects.all().prefetch_related('vessel_components')
    vSerializer = VesselSerializer(vessels, many=True)
    return Response(vSerializer.data)

результат, который я получаю: enter image description here

Я думал, что prefretch_related делает этот трюк, но в DRF.

Это позволит получить Components для Vessels, но поскольку ваши сериализаторы не сериализуют эти компоненты, они не попадут в результат.

Вы должны определить ComponentSerializer как субсериализатор для VesselSerializer, так:

class ComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Component
        fields = '__all__'

class VesselSerializer(serializers.ModelSerializer):
    vessel_components = ComponentSerializer(many=True)  # 🖘 subserializer
    
    class Meta:
        model = Vessel
        fields = '__all__'
Вернуться на верх