簡體   English   中英

Django(DRF):以不同方式序列化和反序列化ManyToMany字段?

[英]Django (DRF): Serialize and deserialize a ManyToMany field differently?

習慣了來自於Tastyepie的Django Rest Framework,但是在ManyToMany字段上卻遇到了問題。

當字段需要序列化時,它最好包含其完整的表示形式,這可以通過添加具有many = True和read_only = True的ModelSerializer輕松完成。 問題是這使我無法保存帳戶字段,因為該字段現在顯示為空白。

如果我嘗試刪除read_only = True,我會得到

TypeError: 'accounts' is an invalid keyword argument for this function

最好發送完整的表示形式,但僅在接收到相關的POST(創建)或PUT(更新)時才需要ID。

開機自檢:

{
    "profile" : "1",
    "accounts" : ["1"],
    "amount" : "101.00"
}

響應:

{
  "id": 92,
  "accounts": [],
  "date_by": null,
  "amount": "101.00",
  "shared": false,
  "profile": 1
}

得到:

[
  {
    "id": 45,
    "accounts": [
      {
        "account_local": {
          "id": 3,
          "last_balance": "100.00",
        },
        "type": "LocalAccount"
      }
    ],
    "date_by": null,
    "amount": "100.00",
    "shared": false,
    "profile": 1
  },]

GoalSerializer

class GoalSerializer(serializers.ModelSerializer):
    accounts = AccountSerializer(many=True, read_only=True)

    class Meta:
        model = Goal

GoalViewSet

class GoalViewSet(GenericViewSet, mixins.RetrieveModelMixin, mixins.ListModelMixin, mixins.CreateModelMixin):
    serializer_class = GoalSerializer
    queryset = Goal.objects.none()

    def get_queryset(self):
        return Goal.objects.filter(profile=self.request.user)

AccountSerializer

class AccountSerializer(serializers.ModelSerializer):
    type = SerializerMethodField('get_account_class')

    class Meta:
        model = Account
        fields = ('account_local','account_external', 'type')
        depth = 1

    def get_account_class(self, obj):
        if isinstance(obj.get_actual(), LocalAccount):
            return obj.get_actual().__class__.__name__
        elif isinstance(obj.get_actual(), ExternalAccount):
            return obj.get_actual().get_actual().__class__.__name__
        else:
            return "Error"

    def to_representation(self, instance):
        data = super(AccountSerializer, self).to_representation(instance)

        if isinstance(instance.get_actual(), ExternalAccount): 
            serializer = ExternalAccountSerializerEMT(instance.account_external.get_actual())
            data['account_external'] = serializer.data

        return data

我設法通過以下方法解決此問題:

  • 使用更改AccountSerializer
    def to_internal_value(self, data): return Account.objects.get(id=data)

  • 刪除字段上的read_only屬性

    accounts = AccountSerializer(many=True)

僅在POST'/ PUT'ing時該帳戶才是ID,而在GET'ing時將返回整個帳戶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM