首頁 > 後端開發 > Python教學 > 如何簡化嵌套 Django REST Framework 序列化程式中的外鍵分配?

如何簡化嵌套 Django REST Framework 序列化程式中的外鍵分配?

Barbara Streisand
發布: 2024-12-09 18:58:19
原創
943 人瀏覽過

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

DRF:嵌套序列化器中的簡化外鍵分配

問題:

使用Django REST Framework ( DRF),a標準ModelSerializer 允許透過將ID 作為整數發布來分配或編輯外鍵模型關係。但是,在使用巢狀序列化器時,複製此行為會引發對最佳方法的懷疑。

解決方案:

重寫to_representation() 方法

一個在巢狀序列化器中實現此功能的方法是重寫父序列化器中的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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板