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

Bagaimana untuk Memudahkan Penugasan Kunci Asing dalam Pensiri Rangka Kerja REST Django Bersarang?

Barbara Streisand
Barbara Streisandasal
2024-12-09 18:58:19939semak imbas

How to Simplify Foreign Key Assignment in Nested Django REST Framework Serializers?

DRF: Penetapan Kunci Asing Dipermudah dalam Pensiri Bersarang

Masalah:

Dengan Rangka Kerja Django REST (DRF), a ModelSerializer standard membenarkan hubungan model ForeignKey diberikan atau diedit dengan menyiarkan ID sebagai integer. Walau bagaimanapun, apabila bekerja dengan penyeri bersiri bersarang, meniru tingkah laku ini menimbulkan keraguan tentang pendekatan terbaik.

Penyelesaian:

Kaedah Overriding to_representation()

Satu kaedah untuk mencapai fungsi ini dalam penyeri bersarang adalah untuk mengatasi kaedah to_representation() dalam induk penyeri bersiri. Teknik ini mempunyai kelebihan berikut:

  • Tidak memerlukan medan yang berasingan untuk penciptaan dan pembacaan.
  • Kedua-dua penciptaan dan pembacaan boleh dilakukan menggunakan kekunci yang sama.

Contoh Pensiri Induk dengan Modified to_representation() Kaedah:

class ParentSerializer(ModelSerializer):

    class Meta:
        model = Parent
        fields = '__all__'

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['child'] = ChildSerializer(instance.child).data
        return response

Menggunakan Medan Pensiri Tersuai

Untuk penyelesaian yang lebih generik, pertimbangkan untuk mencipta medan bersiri tersuai dipanggil RelatedFieldAlternative. Medan ini memastikan keserasian dengan DRF versi 3.x dan 4.x.

Medan Pensiri Tersuai:

from rest_framework import serializers

class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):

    def __init__(self, **kwargs):
        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):
        return False if self.serializer else True

    def to_representation(self, instance):
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)

Menggunakan Medan Tersuai dalam Induk Pensiri:

class ParentSerializer(ModelSerializer):

    child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)

    class Meta:
        model = Parent
        fields = '__all__'

Atas ialah kandungan terperinci Bagaimana untuk Memudahkan Penugasan Kunci Asing dalam Pensiri Rangka Kerja REST Django Bersarang?. 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