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)
Я думал, что
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__'
