Python Django rest框架获取除POST pk之外的所有数据
我正在创建一个API,并试图找出如何将我的Python Django rest框架获取除POST pk之外的所有数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在创建一个API,并试图找出如何将我的Shipping模型中的所有数据返回到GET方法中,但仍然通过POST方法发送pk 我已经阅读了一些解决方案,但它并没有解决我的整个问题,在某些情况下,我需要API中的两种不同行为,其中客户端只需要发送主键 我希望在我的GET/Shipping中有这样的内容: [{ "pk": 1, ... "city_of_origin": { "pk": 1, "name": "San Francisco",
Shipping
模型中的所有数据返回到GET方法中,但仍然通过POST方法发送pk
我已经阅读了一些解决方案,但它并没有解决我的整个问题,在某些情况下,我需要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]
}]
我一直在尝试更改我的序列化程序.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
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
它可以很好地返回所有数据,但是它改变了我所有的API根表单,迫使我创建一个嵌套到我的Shipping中的城市和州,在我更改序列化程序之前,我有一个包含城市的下拉菜单。然而,这个下拉列表的显示是我在POST表单上期望的行为
这是我的型号.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
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 rest framework 3.3.3如果同一rest api视图处理
get
和post
,我认为您使用的是类似ViewSet
(或适当混合的GenericAPIView)的东西。您的ViewSet
将使用不同的序列化程序获取和发布
要获取/列出,您将使用已创建的(让我们重命名它):
投寄:
class ShippingPostSerializer(serializers.ModelSerializer):
city_of_origin = serializers.PrimaryKeyRelatedField()
destination_cities = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Shipping
您的视图集的get\u 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\u class
类属性分配给我所写的相应序列化程序。如果get
和post
由相同的rest api视图处理,我认为您使用的是类似于视图集
(或适当混合的GenericAPIView)的东西。您的ViewSet
将使用不同的序列化程序获取和发布
要获取/列出,您将使用已创建的(让我们重命名它):
投寄:
class ShippingPostSerializer(serializers.ModelSerializer):
city_of_origin = serializers.PrimaryKeyRelatedField()
destination_cities = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Shipping
您的视图集的get\u 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\u class
类属性分配给相应的序列化程序。对不起,我忘了提到它,但是我使用的这种视图集带有ModelViewSet
和queryset和serializer类的默认声明。您的解决方案非常有效,我非常感谢,谢谢!很抱歉,我忘了提到它,但我使用的是带有ModelViewSet
的这种视图集,以及queryset和serializer类的默认声明。您的解决方案非常有效,我非常感谢,谢谢!