問題:
使用Django REST Framework ( DRF),a標準ModelSerializer 允許透過將ID 作為整數發布來分配或編輯外鍵模型關係。但是,在使用巢狀序列化器時,複製此行為會引發對最佳方法的懷疑。
解決方案:
一個在巢狀序列化器中實現此功能的方法是重寫父序列化器中的to_representation() 方法。此技術具有以下優點:
修改了to_representation() 的範例父序列化器方法:
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
對於更通用的解決方案,請考慮建立一個名為RelatedFieldAlternative 的自訂序列化器欄位。此欄位可確保與 DRF 版本 3.x 和 4.x 的兼容性。
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)
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer) class Meta: model = Parent fields = '__all__'
以上是如何簡化嵌套 Django REST Framework 序列化程式中的外鍵分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!