在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'})
答案 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