嵌套的多对多字段不在响应中

问题描述

我正在尝试编写一个嵌套的序列化器,该序列化器将在同一视图中添加序列化2个模型。序列化似乎可以正常工作,因为更改会反映在数据库中,但是我无法在响应中获取与多对多相关的字段数据。我一直在试图找出问题所在,但仍然没有任何进展。 这是我的代码

模型

class User(AbstractBaseUser):
    AccountName = models.ManyToManyField(Account,through='User_Account',through_fields=('user','acc'),related_name='AccountData',blank=True)

    EmailId = models.EmailField(max_length=128,blank=False,null=False)

    USERNAME_FIELD = 'EmailId'
    required_FIELDS = ['AccountName']
class Account(models.Model):
    AccountName = models.TextField(max_length=100,null=False)

序列化器

class AccountCreationSerializer(ModelSerializer):
    class Meta:
        model = Account
        fields = ["AccountName"]

class SignUpSerializer1(ModelSerializer):
    AccountData = AccountCreationSerializer(read_only=True,many=True)

    class Meta:
        model = User
        fields = ['EmailId','AccountData','password']
        extra_kwargs = {'password': {'write_only': True,'required': True}}

    def validate(self,attrs):
        attrs = super(SignUpSerializer1,self).validate(attrs=attrs)
        attrs.update({"AccountData": self.initial_data.get("AccountData")})
        return attrs

    def create(self,validated_data):
        AccountName_data = validated_data.pop('AccountData')
        acc = Account.objects.create(AccountName=AccountName_data)
        userAcc = User.objects.create_user(**validated_data)
        if acc:
            userAcc.AccountName.add(acc)
            print("added")
        return userAcc

查看

class SignUpView(APIView):
    serializer_class1 = SignUpSerializer1

    def post(self,request,*args,**kwargs):

        if request.data['CreateAccount']:
            serializer = self.serializer_class1(data=request.data)
            is_valid_serializer = serializer.is_valid(raise_exception=True)
            if is_valid_serializer:
                with transaction.atomic():
                    serializer.save()
                return Response(serializer.data,status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

        else:
            raise Exception("Bad error")

Request1

    "EmailId" : "[email protected]","AccountData":{"AccountName":"TestAcc1"},"CreateAccount": true,"password" : "xyz"

回复

    "EmailId": "[email protected]",

#从AccountData中删除read_only = true后

Request2

    "EmailId" : "[email protected]","password" : "xyz"

回复

    {"AccountData":{"non_field_errors":["Expected a list of items but got type \"dict\"."]}}

Request3

    "EmailId" : "[email protected]","AccountData":[{"AccountName":"TestAcc1"}],"password" : "xyz"

回复

 Got AttributeError when attempting to get a value for field `AccountData` on serializer `SignUpSerializer1`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'AccountData'.

响应中没有AccountName的响应数据。当我尝试print(User.objects.get(EmailId = serializer.data['AccountName'])) ====> None时。
如何在响应中以正确的方式填充字段? 谢谢!

解决方法

您需要指定source参数,因为模型的字段称为AccountName,而不是AccountData

class SignUpSerializer1(ModelSerializer):
    AccountData = AccountCreationSerializer(many=True,source="AccountName")