我正在创建一个API并尝试弄清楚如何将所有数据从Shipping
模型返回到GET方法,但仍然通过POST方法发送pk。
我已经阅读了一些解决方案here和here,但它并没有解决我的整个问题,在某些时候我需要两个不同的行为来自我的API,客户端需要发送只有主键。
我希望我的GET /Shipping
:
[{
"pk": 1,
...
"city_of_origin": {
"pk": 1,
"name": "San Francisco",
"state": {
"pk": 1,
"initial": "CA",
"name": "California"
}
},
"destination_cities": [
{
"pk": 2,
"name": "San Jose",
"state": {
"pk": 1,
"initial": "CA",
"name": "California"
}
},{
"pk": 3,
"name": "Los Angeles",
"state": {
"pk": 1,
"initial": "CA",
"name": "California"
}
}
]
}]
这是我的帖子:
[{
"pk": 1,
...
"city_of_origin": 1,
"destination_cities": [2, 3]
}]
我一直试图改变我的serializers.py
:
class StateSerializer(serializers.ModelSerializer):
class Meta:
model = State
class CitySerializer(serializers.ModelSerializer):
state = StateSerializer()
class Meta:
model = City
class ShippingSerializer(serializers.ModelSerializer):
city_of_origin = CitySerializer()
destination_cities = CitySerializer(many=True)
class Meta:
model = Shipping
它可以很好地返回所有数据,但是它更改了我的所有API Root表单,强制创建一个城市和一个嵌套到我的Shipping的状态,在我更改序列化程序之前,我有一个带有城市的下拉菜单。然而,这个下拉列表的展览是我在POST表格上所期望的行为。
这是models.py
:
class Shipping(models.Model):
city_of_origin = models.ForeignKey(City, related_name='origin', default=None)
destination_cities = models.ManyToManyField(City, related_name='destiny', default=None)
class City(models.Model):
name = models.CharField(blank=False, null=True, max_length=255)
state = models.ForeignKey(State, null=True)
def __str__(self):
return self.name
class State(models.Model):
name = models.CharField(blank=False, null=True, max_length=255)
initial = models.CharField(max_length=2, blank=False, null=True)
def __str__(self):
return self.name
我想事先感谢你们能给我的所有帮助。
编辑: 我使用Django 1.9.5和Django休息框架3.3.3
答案 0 :(得分:2)
如果get
和post
由相同的其他api视图处理,我认为您使用的是ViewSet
(或适当混合的GenericAPIView)。您的ViewSet
将使用不同的序列化程序进行获取和发布。
获取/列出你将使用你已创建的那个(让我们重命名):
class ShippingGetSerializer(serializers.ModelSerializer):
city_of_origin = CitySerializer()
destination_cities = CitySerializer(many=True)
class Meta:
model = Shipping
发布:
class ShippingPostSerializer(serializers.ModelSerializer):
city_of_origin = serializers.PrimaryKeyRelatedField()
destination_cities = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Shipping
您的ViewSet会定义get_serializer()
,如下所示:
class ShippingViewSet(viewsets.ModelViewSet):
queryset = Shipping.objects.all()
def get_serializer_class(self):
if self.request.method == 'POST':
return ShippingPostSerializer
return ShippingGetSerializer
如果您对get和post入口点使用两个不同的视图,请创建每个视图,将serializer_class
class属性分配给我写的相应序列化器。