** 之后的 Django TypeError get() 参数必须是映射,而不是列表
Django TypeError get() argument after ** must be a mapping, not list
我正在为一个模型创建一个序列化程序,该模型具有引用标签 table.
的 ManyToManyField (tag_id)
serializers.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)
<strong>for tag_item in</strong> tag_data:
tag = Tag.objects.get_or_create(<strong>**tag_item</strong>)[0]
validated_data['tag_id'] = tag
由于这些是列表,因此最好在验证数据中列出标签:
tag_data = validated_data.pop('tag_id', None)
validated_data['tag_id'] = <strong>[</strong>
Tag.objects.get_or_create(**tag_item)[0]
for tag_item in tag_data
<strong>]</strong>
我正在为一个模型创建一个序列化程序,该模型具有引用标签 table.
的 ManyToManyField (tag_id)serializers.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)
<strong>for tag_item in</strong> tag_data:
tag = Tag.objects.get_or_create(<strong>**tag_item</strong>)[0]
validated_data['tag_id'] = tag
由于这些是列表,因此最好在验证数据中列出标签:
tag_data = validated_data.pop('tag_id', None)
validated_data['tag_id'] = <strong>[</strong>
Tag.objects.get_or_create(**tag_item)[0]
for tag_item in tag_data
<strong>]</strong>