Bagaimana untuk Menetapkan Kunci Asing dalam Pensiri Bersarang dengan Rangka Kerja Django REST?

Patricia Arquette
Lepaskan: 2024-11-11 20:52:02
asal
732 orang telah melayarinya

How to Assign Foreign Keys in Nested Serializers with Django REST Framework?

DRF: Tugasan Kunci Asing Mudah dengan Pensiri Bersarang

Dalam Rangka Kerja Django REST, ModelSerializer standard membenarkan penugasan atau pengubahsuaian perhubungan model ForeignKey melalui Menyiarkan ID sebagai integer. Walau bagaimanapun, mengekstrak gelagat ini daripada penyeri bersiri bersarang boleh menjadi satu cabaran.

Pendekatan Penyeri Bersarang Paling Mudah

DRF tidak semestinya menyediakan fungsi ini, memerlukan medan penyeri tersuai :

from rest_framework import serializers

class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):
    def __init__(self, **kwargs):
        # Serializer for this field
        self.serializer = kwargs.pop('serializer', None)
        if self.serializer is not None and not issubclass(self.serializer, serializers.Serializer):
            raise TypeError('"serializer" is not a valid serializer class')

        super().__init__(**kwargs)

    def use_pk_only_optimization(self):
        # Avoid using PK optimization if a serializer is provided
        return False if self.serializer else True

    def to_representation(self, instance):
        # Use provided serializer or default representation
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)
Salin selepas log masuk

Dalam penyeri induk anda, gunakan medan baharu ini sebagai berikut:

class ParentSerializer(ModelSerializer):
    child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)

    class Meta:
        model = Parent
        fields = '__all__'
Salin selepas log masuk

Dengan pendekatan generik ini, anda boleh mengendalikan berbilang penyeri bersiri dengan kefungsian ini dengan mudah.

Kaedah Override to_representation()

Sebagai alternatif, mengatasi kaedah to_representation() penyeri induk juga mencapai ini matlamat:

class ParentSerializer(ModelSerializer):
    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['child'] = ChildSerializer(instance.child).data
        return response
Salin selepas log masuk

Kaedah ini memerlukan penentuan medan berbeza untuk penciptaan dan pembacaan, yang mungkin tidak sesuai.

Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Kunci Asing dalam Pensiri Bersarang dengan Rangka Kerja Django REST?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan