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

标签 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'}

有时是所谓的自然键,即:

{'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'})

最佳答案

您需要为要使用的每种序列化类型定义不同的序列化程序。然后覆盖 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

关于django - django rest框架中的id、url和自然键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129028/

相关文章:

python - 相关对象上的多个注释

mysql - django + mysql,存储 ip 地址,包括范围

sql - Django - 在没有外键的情况下连接不同的模型

python - 运行 Heroku Django 教程时出现的问题

python - 需要使用 GeoDjango 在 postGIS 上实现性能

python - 为什么我的表单 URL 为所有帖子传递相同的主键?

java - 在 Jersey 中为 REST API 处理完整和部分 View

WCF 全局 (.asax) 行为

java - 向服务器发送 DELETE 时出现错误 405 方法不允许错误

python - 如何让我的用户将歌曲添加到 django 中的专辑中