Id,url和django rest框架中的自然键

时间:2015-05-08 16:54:02

标签: django rest django-models django-rest-framework

在Django中考虑这些模型:

class ModelA(models.Model):
    name = models.CharField()

class ModelB(models.Model):
    model_a = models.ForeignKey(ModelA)

现在假设您已使用Django Rest Framework创建了一个API来访问这些模型。访问http://my.site.com/api/model_b/1以检索ModelB实例时,有时您会想要id相关的ModelA实例,即:

{'id': 1, 'model_a': 17}

有时你会想要得到url,即:

{'id': 1, 'model_a': 'http://my.site.com/api/model_a/17'}

和其他时间所谓的natural key,即:

{'id': 1, 'model_a': 'some_representative_string_describing_the_instance'}

我的问题:是否有内置功能可以根据get参数处理model_a的引用类型,例如:

http://my.site.com/api/model_b/1?fk_type=id
http://my.site.com/api/model_b/1?fk_type=url
http://my.site.com/api/model_b/1?fk_type=natural_key

更新:此外,当ModelB有两个或更多外键时,我想更好地控制,允许我独立决定编码类型。类似的东西:

ModelBSerializer(model_b_instance, fk_encoding={'model_a': 'url', 'model_c': 'natural_key'})

1 个答案:

答案 0 :(得分:1)

您需要为要使用的每种类型的序列化定义不同的序列化程序。然后覆盖get_serializer_class。如下所示:

#by default django serializes FK by id
class ModelBIdSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelB


class ModelBUrlSerializer(serializers.ModelSerializer):
    model_a = serializers.HyperlinkedRelatedField(view_name='model-a-detail')

    class Meta:
        model = ModelB


class ModelBNaturalSerializer(serializers.ModelSerializer):
    model_a = serializers.StringRelatedField()

    class Meta:
        model = ModelB

然后在ModelBViewSet

class ModelBViewSet():
    #...

    def get_serializer_class(self):
        if self.request.GET.get('fk_type') == 'url':
            return ModelBUrlSerializer
        elif self.request.GET.get('fk_type') == 'natural_key':
            return ModelBNaturalSerializer
        else:
            return ModelBIdSerializer