【问题标题】:Django Post request for many to many field ValueErrorDjango Post请求多对多字段ValueError
【发布时间】:2022-02-09 04:29:03
【问题描述】:

我正在处理用户从标签列表中选择并组合标签的发布请求。然后应该发布标签组合。 Tag 表中的任何内容都不应更改。

这些是模型:

models.py

class Tag(models.Model):
    name = models.CharField(max_length=256)
    language = models.CharField(max_length=256)

    objects = models.Manager()

    def __str__(self):
        """Return a human readable representation of the model instance."""
        return self.name or ''

    @property
    def tags(self):
        tags = self.tagging.values('tag')
        return tags.values('tag_id', 'tag__name', 'tag__language')


class Combination(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
    gameround = models.ForeignKey(Gameround, on_delete=models.CASCADE, null=True)
    resource = models.ForeignKey(Resource, on_delete=models.CASCADE, null=True)
    tag_id = models.ManyToManyField(Tag, null=True)
    created = models.DateTimeField(editable=False)
    score = models.PositiveIntegerField(default=0)

    objects = models.Manager()

    def __str__(self):
        return str(self.tag_id) or ''

这是组合的序列化程序。

serializers.py

class CombinationSerializer(serializers.ModelSerializer):
  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

    tag_data = validated_data.pop('tag_id', None)

    combination = Combination(
      user=user,
      gameround=validated_data.get("gameround"),
      resource=validated_data.get("resource"),
      created=datetime.now(),
      score=score
    )
    combination.save()
    for tag_object in tag_data[0]:
      combination.tag_id.add(tag_object)
    return combination

  def to_representation(self, instance):
    rep = super().to_representation(instance)
    rep['tag_id'] = TagWithIdSerializer(instance.tag_id.all(), many=True).data
    return rep

我已尝试将以下 JSON 对象发布到数据库:

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

我收到一个 ValueError:字段 'id' 需要一个数字,但得到了 'name'。

我该如何解决这个问题?

【问题讨论】:

  • 尝试将tag_id = TagWithIdSerializer改为tag_id = serializers.PrimaryKeyRelatedField
  • 我有并且我得到了“tag_id”:[“不正确的类型。预期的 pk 值,收到的列表。” ]
  • 抱歉,完整的更改将是 tag_id = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True)。由于您传递了一个 id 列表,因此您将需要 many=True
  • 我有并且我收到与以前相同的错误消息。

标签: django-models django-rest-framework


【解决方案1】:

您需要为每个标签提供标签ID,而不是所有标签数据,

这样试试

{
            "gameround_id": 2015685170,
            "resource_id": 327888,
            "tag_id": [2014077506,2014077507]
    }

【讨论】:

  • 我又试了一次,只会报如下错误:{"tag_id":[{"non_field_errors":["Invalid data. Expected a dictionary, but got int."]}, {"non_field_errors":["无效数据。需要字典,但得到了 int。"]}]}
猜你喜欢
  • 2019-11-20
  • 2021-07-09
  • 2020-09-11
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多