django rest框架中的Id、url和自然键
以Django中的这些模型为例: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,即:
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时允许更精细的控制(请参阅我问题中的更新部分)。