**之后的Django TypeError get()参数必须是映射,而不是列表



我正在为一个模型创建一个序列化程序,该模型具有引用tag表的ManyToManyField(tag_id(。

序列化程序.py

class CombinationSerializer(serializers.ModelSerializer):
# tag_id = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), source='tag', required=False, many=True)
tag_id = TagWithIdSerializer(many=True, required=False, write_only=False)
resource_id = serializers.PrimaryKeyRelatedField(queryset=Resource.objects.all(),
required=True,
source='resource',
write_only=False)
gameround_id = serializers.PrimaryKeyRelatedField(queryset=Gameround.objects.all(),
required=False,
source='gameround',
write_only=False)
user_id = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all(),
required=False,
source='user',
write_only=False)
class Meta:
model = Combination
depth = 1
fields = ('id', 'user_id', 'gameround_id', 'resource_id', 'tag_id', 'created', 'score')
def create(self, validated_data):
user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
score = 0
combination = Combination(
user=user,
gameround=validated_data.get("gameround"),
resource=validated_data.get("resource"),
created=datetime.now(),
score=score
)
combination.save()
tag_data = validated_data.pop('tag_id', None)
if tag_data:
tag = Tag.objects.get_or_create(**tag_data)[0]
validated_data['tag_id'] = tag

combination.tag_id.add(validated_data.get("tag_id"))
return combination

这是有问题的代码:

tag_data = validated_data.pop('tag_id', None)
if tag_data:
tag = Tag.objects.get_or_create(**tag_data)[0]
validated_data['tag_id'] = tag

combination.tag_id.add(validated_data.get("tag_id"))

这是我试图在Postman:中发送的JSON对象

{
"gameround_id": 2015685170,
"resource_id": 327888,
"tag_id": [{"id": 2001372884, "name": "combination", "language": "en"}]
}

我在这里做错了什么?这可以用其他方法吗?

tag_id映射在字典列表上,而不是字典。因此,你可以在上面列举:

tag_data = validated_data.pop('tag_id', None)
for tag_item intag_data:
tag = Tag.objects.get_or_create(**tag_item)[0]
validated_data['tag_id'] = tag

由于这些都是列表,因此最好在经过验证的数据中列出标签:

tag_data = validated_data.pop('tag_id', None)
validated_data['tag_id'] =[
Tag.objects.get_or_create(**tag_item)[0]
for tag_item in tag_data
]

最新更新