Python Django rest框架获取除POST pk之外的所有数据

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",

我正在创建一个API,并试图找出如何将我的
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类的默认声明。您的解决方案非常有效,我非常感谢,谢谢!