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!