Django休息框架获取所有数据但POST pk

时间:2016-07-29 20:57:25

标签: python django django-rest-framework

我正在创建一个API并尝试弄清楚如何将所有数据从Shipping模型返回到GET方法,但仍然通过POST方法发送pk。

我已经阅读了一些解决方案herehere,但它并没有解决我的整个问题,在某些时候我需要两个不同的行为来自我的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

1 个答案:

答案 0 :(得分:2)

如果getpost由相同的其他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属性分配给我写的相应序列化器。