【发布时间】: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