【问题标题】:DRF post to model with a many-to-many fieldDRF post to model with a many-to-many field
【发布时间】:2021-06-25 13:58:02
【问题描述】:

我有以下型号:

class Tag(TimeStampModel):
    name = models.CharField(unique=True, max_length=100)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    featured = models.BooleanField(default=False, blank=True)

class Deal(VoteModel, models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='deals',
                            on_delete=models.CASCADE)
    title = models.CharField(max_length=1024, blank=False, null=False)
    slug = models.SlugField(max_length=1024, unique=True, blank=True)
    description = models.TextField(blank=False, null=False)
    poster = models.ImageField(blank=True)
    tags = models.ManyToManyField(
        Tag, blank=True)

以及以下序列化程序:

class TagSerializer(serializers.ModelSerializer):

    class Meta:
        model = Tag
        fields = ['id', 'name', 'slug', 'featured', 'created_at']


class DealSerializer(serializers.ModelSerializer):

    user = UserSerializer(many=False, read_only=True)
    tags = TagSerializer(many=True, read_only=True)
    tags_ids = serializers.PrimaryKeyRelatedField(many=True, write_only=True, queryset=Tag.objects.all())

    class Meta:
        model = Deal
        fields = '__all__'

Views

class DealList(viewsets.ModelViewSet, VoteMixin):
    serializer_class = DealSerializer
    permission_classes = [IsOwnerOrAdminOrReadOnly]

    def get_queryset(self):
        return Deal.objects.all()

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

我能够获取数据并发布它,但由于多对多字段 (tags),我似乎有一些问题,因为 Deal 可能只有 tags (预先创建,不能通过对 Deal 的 post 请求创建)。 我发送数据如下:

{
    title: 'some title',
    all_other_fields: 'some data',
    tags_ids: [2, 4]
}

标签作为标签 id 的数组发送,但我收到如下错误:

"Incorrect type. Expected pk value, received str."

我只添加了tags_ids,因此我可以对其执行写操作,因为我无法找到将字段tags用作读取和写入字段的方法,该字段将在读取时返回一个对象,并且在写入时接受 id。

我已经阅读了 Stackoverflow 上的许多帖子,但还没有对我有用的帖子。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 只是为了确保我理解您所说的正确,您的部分要求是标签将在之前创建并且不能与交易一起创建,对吗?所以你确定你得到的标签ID是有效的ID
  • @Jimmar 感谢您的回复。没错。

标签: python django serialization django-rest-framework


【解决方案1】:

尝试像这样更改您的序列化程序

class DealSerializer(serializers.ModelSerializer):

    user = UserSerializer(many=False, read_only=True)
    tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all())

    class Meta:
        model = Deal
        fields = '__all__'

【讨论】:

    【解决方案2】:

    尝试这样做。

    class DealSerializer(serializers.ModelSerializer):
    
        user = UserSerializer(read_only=True)
        tags = TagSerializer(read_only=True)
        class Meta:
            model = Deal
            fields = ('user', 'title', 'slug', 'description', 'poster', 'tags')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多