我有一个这样的端点:'host.com/questions/123/vote'。前端可以向该端点发送具有“向上”或“向下”的投票类型的发布请求。 在后端,投票是这样的:
class Vote(models.Model):
UP = 'UP'
DOWN = 'DOWN'
CHOICE = ((UP, 'upvote'), (DOWN, 'downvote'))
post_content_type = models.ForeignKey(ContentType,
on_delete=models.CASCADE)
post_id = models.PositiveIntegerField()
post = GenericForeignKey('post_content_type', 'post_id')
voter = models.ForeignKey(to=settings.AUTH_USER_MODEL,
related_name='votes')
type = models.CharField(choices=CHOICE, max_length=8)
class Meta:
unique_together = ('post_content_type', 'post_id', 'voter')
我使用通用fk,因为除了问题你也可以投票给不同的模型实例。
现在我使用DRF的CreateAPIView创建这个api端点。
这是我的问题:
如何从两个来源传递数据:request.data(投票类型所在的位置)和kwargs(问题ID和内容类型'问题')。
我试过了:
答案 0 :(得分:0)
您需要为post_content_type和post_id指定一些write_only字段。
class VoteSerializer(serializers.Serializer):
post_content_type_id = serializers.PrimaryKeyRelatedField(write_only=True)
post_id = serializers.IntegerField(write_only=True)
type = serializers.CharField()
## your other fields ...
如果您对如何为通用关系输出不同的表示感到好奇,请查看DRF文档的这一部分:http://www.django-rest-framework.org/api-guide/relations/#generic-relationships。
答案 1 :(得分:0)
我最终覆盖了序列化程序中的to_internal
函数,并通过覆盖get_serializer_context
中的CreateAPIView
来传递网址数据,并使用self.context
中的to_internal
获取数据{1}}功能