考虑 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/