Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menetapkan Kunci Asing dalam Pensiri Bersarang dengan Rangka Kerja Django REST?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-11 20:52:02807semak imbas

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)

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__'

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

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!

Kenyataan:
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