![](/img/trans.png)
[英]Error when trying to Serialize a ManyToMany relationship (Django with DRF)
[英]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.