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

django rest框架中的Id、url和自然键,django,rest,django-models,django-rest-framework,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框架创建了一个API来访问这些模型。访问http://my.site.com/api/model_b/1要检索ModelB实例,有时您需要相关ModelA实例的id,即:

以Django中的这些模型为例:

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

class ModelB(models.Model):
    model_a = models.ForeignKey(ModelA)
现在假设您已经使用Django Rest框架创建了一个API来访问这些模型。访问
http://my.site.com/api/model_b/1
要检索
ModelB
实例,有时您需要相关ModelA实例的
id
,即:

{'id': 1, 'model_a': 17}
有时您会想获取其
url
,即:

{'id': 1, 'model_a': 'http://my.site.com/api/model_a/17'}
{'id': 1, 'model_a': 'some_representative_string_describing_the_instance'}
而其他时间则是所谓的
自然键
,即:

{'id': 1, 'model_a': 'http://my.site.com/api/model_a/17'}
{'id': 1, 'model_a': 'some_representative_string_describing_the_instance'}
我的问题:是否有一个内置功能可以根据get参数处理对
模型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'})

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

#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

thx,但这并不能完全满足我。。。每次我需要这个特性时,我应该创建3个不同的序列化程序,而且序列化程序可能比这些要复杂得多,因此我需要维护大量重复的代码。我想知道一些更简洁的东西,可能是在序列化程序级别实现的,并且在ModelB有两个或更多fk时允许更精细的控制(请参阅我问题中的更新部分)。