'动态' DRF序列化程序中的字段

时间:2014-11-09 15:28:47

标签: python django-rest-framework

我的目标是构建端点,该端点将使用GenericForeignKey创建模型对象。由于model还包含ContentType,因此在创建对象之前,我们将引用的实际模型类型是未知的。

我将提供一个例子:

我有一个'喜欢'模型可以引用一组其他模型,如“书籍”,“作者”等。

class Like(models.Model):
    created = models.DateTimeField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

Serializer可能如下所示:

class LikeSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Like
        fields = ('id', 'created', )

我想要实现的是根据请求中传递的键确定Like的类型。问题是如果Serializer字段中没有明确指定DRF,则DRF不会从请求中传递这些密钥。例如,POST请求正文包含:

{
    "book":2
}

我想做下一步

def restore_object(self, attrs, instance=None)
    if attrs.get('book', None) is not None:
        # create Like instance with Book contenttype
    elif attrs.get('author', None) is not None:
        # create Like instance with Author contenttype

在这种情况下,将执行第一个if子句。 如您所见,根据请求中传递的键确定的类型,而不指定特殊字段。

有没有办法实现这个目标?

由于

1 个答案:

答案 0 :(得分:0)

您可以尝试在调用视图时通过将其包装在函数中来实例化您的序列化程序(您创建一个序列化工厂):

def like_serializer_factory(type_of_like):
    if type_of_like == 'book':
        class LikeSerializer(serializers.ModelSerializer):
            class Meta:
                model = models.Like
                fields = ('id', 'created', )
            def restore_object(self, attrs, instance=None):
                # create Like instance with Book contenttype
    elif type_of_like == 'author':
        class LikeSerializer(serializers.ModelSerializer):
            class Meta:
                model = models.Like
                fields = ('id', 'created', )
            def restore_object(self, attrs, instance=None):
                # create Like instance with Author contenttype
    return LikeSerializer

然后在视图中覆盖此方法:

def get_serializer_class(self):
    return like_serializer_factory(type_of_like)