Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Memudahkan Penugasan Kunci Asing dalam Pensiri Rangka Kerja REST Django 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:
Satu kaedah untuk mencapai fungsi ini dalam penyeri bersarang adalah untuk mengatasi kaedah to_representation() dalam induk penyeri bersiri. Teknik ini mempunyai kelebihan berikut:
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
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!