Django rest framework之ModelSerializ

suliver發表於2021-09-09

巢狀的序列化關係複雜了,預設的ModelSerializer的 .create() 和 .update() 方法是不支援nested representations的。所以REST framework 3要求你針對nested representations自己寫專門的方法。
一個替代方案是“在模型管理器類中儲存相關例項”。


處理多個物件
  • Serializing multiple objects
    設定many=true
queryset = Book.objects.all()
serializer = BookSerializer(queryset, many=True)
serializer.data

使用context可以新增其它欄位,.to_representation()方法透過self.context屬性訪問。

serializer = AccountSerializer(account, context={'request': request})
serializer.data

ModelSerializer

快速建立相關模型的serializer 模型

  1. 自動產生基於模型的fileds
  2. 自動產生驗證器,比如unique_together驗證器
  3. 預設包含create和uodate方法
    外來鍵被對映為PrimaryKeyRelatedField.
class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'users', 'created')

檢查modelserializer

python manage.py shell
>>> from myapp.serializers import AccountSerializer
>>> serializer = AccountSerializer()
>>> print(repr(serializer))
AccountSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(allow_blank=True, max_length=100, required=False)
    owner = PrimaryKeyRelatedField(queryset=User.objects.all())

顯示哪些欄位

fields = ('id', 'account_name', 'users', 'created')
 fields = '__all__'
exclude = ('users',)
Specifying nested serialization

ModelSerializer預設使用關聯模型的主要關鍵字,指明depth可以得到更多

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'users', 'created')
        depth = 1
自定義欄位

在serilaizer裡面指定對應的函式,source='get_absolute_url',

class AccountSerializer(serializers.ModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    groups = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Account
Specifying read only fields

設定了editable=False和AutoField欄位的預設是read-only.

read_only_fields = ('account_name',)

注意:即使read-only物件又unique_together限制,這時Providing both the read_only=True and default=… keyword arguments.

serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
附加關鍵字引數

與read_only_fields一樣,這意味著您不需要在序列器上顯式宣告該欄位。
將欄位名稱對映到關鍵字引數的字典。

extra_kwargs = {'password': {'write_only': True}}
關聯欄位

替代表示:使用超連結進行序列化,序列化完整的巢狀表示,或使用自定義表示序列化。

Customizing field mappings

通常,如果一個ModelSerializer沒有生成預設情況下需要的欄位,那麼您應該將它們明確地新增到類中,或者直接使用常規的Serializer類。 但是在某些情況下,您可能需要建立一個新的基類,定義如何為任何給定的模型建立序列化程式欄位。

  • .serializer_field_mapping
  • .serializer_related_field
  • serializer_url_field
  • serializer_choice_field

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2799487/,如需轉載,請註明出處,否則將追究法律責任。

相關文章