Django Rest Framework,模型序列化器,使用只读数据

时间:2017-05-28 17:16:04

标签: django django-rest-framework

我有一个这样的端点:'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和内容类型'问题')。

我试过了:

  1. 将kwargs传递给self.get_serializer_context并通过SerializerMethodField获取,但无法正常工作
  2. 直接将kwrags传递给perform_create,但这会在drf端传递验证。

2 个答案:

答案 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}}功能