Tengo un conjunto de vistas que recupera un conjunto de consultas (Region.objects.filter(id=region_id)), y quiero serializar el conjunto de consultas para incluir una serie de tablas a las que se hace referencia por clave externa así:

Region >> Market >> Baskets >> Fruits

Cada fruit tiene un basket_id

Cada basket tiene un market_id

Cada market tiene un region_id

Tengo un serializador:

class RegionSerializer(serializers.ModelSerializer):
    markets = serializers.SerializerMethodField()

    class Meta:
        model = Region
        fields = '__all__'

    def get_markets(self, obj):
        return ==(list(obj.region_set.all().filter(region_id=obj.id).values()))

Hasta ahora, esto funciona muy bien para recuperar la lista de mercado, pero quiero anidarlo para tener una región, una lista de mercados individuales en la región, una lista de canastas individuales en cada mercado y una lista de frutas individuales en cada canasta. .

No estoy del todo seguro de cómo lograr dichos subcampos usando el serializador.

0
GeneralBear 1 sep. 2020 a las 16:51

1 respuesta

La mejor respuesta

Algo como esto funcionaría? Debería usar related_name para las relaciones FK, creo, p. Ej. en el siguiente ejemplo, el FK entre la fruta y la canasta se establecería con related_name='fruit'

class FruitSerializer(serializers.ModelSerializer)
    class Meta:
        model = Fruit
        fields = '__all__'

class BasketSerializer(serializers.ModelSerializer)
    fruit = FruitSerializer(many=True)

    class Meta:
        model = Basket
        fields = '__all__'

class MarketSerializer(serializers.ModelSerializer)
    baskets = BasketSerializer(many=True)

    class Meta:
        model = Market
        fields = '__all__'

class RegionSerializer(serializers.ModelSerializer)
    markets = MarketSerializer(many=True)

    class Meta:
        model = Region
        fields = '__all__'

Vale la pena considerar también las implicaciones de rendimiento de anidar un montón de cosas como esta. Podría terminar golpeando mucho la base de datos.

2
RHSmith159 1 sep. 2020 a las 14:30