Python 在Django Rest框架中发布外键ID

Python 在Django Rest框架中发布外键ID,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django Rest框架开发Django API。我有两个相关实体,事件和场馆。事件发生在一个地点 通过使用嵌套序列化,我可以将以下内容返回给API用户: { "id": "1234", "name": "My event", "venue": { "id": "5678", "name": "My venue" } } 这一切都是意料之中的。但是,我现在尝试发布一个事件,并将地点作为一个参数: POST /api/events/ { "nam

我正在使用Django Rest框架开发Django API。我有两个相关实体,
事件
场馆
。事件发生在一个地点

通过使用嵌套序列化,我可以将以下内容返回给API用户:

{
  "id": "1234",
  "name": "My event",
  "venue": {
    "id": "5678",
    "name": "My venue"
  }
}
这一切都是意料之中的。但是,我现在尝试发布一个事件,并将地点作为一个参数:

POST /api/events/

{
  "name": "My new event",
  "venue_id": "5678"
}
但我正在努力让这一切顺利进行。我尝试将
场馆id
场馆
作为属性名称(我更喜欢
\u id
,因为这样更正确,但没什么大不了的)

我正在使用以下序列化程序:

class VenueSerializer(serializers.ModelSerializer):
类元:
模型=场地
字段=['id'、'name'、'created_at'、'updated_at']
类EventSerializer(serializers.ModelSerializer):
地点=VenueSerializer()
类元:
模型=事件
字段=['id'、'name'、'vention'、'created_at'、'updated_at']

实现这一点的正确方法是什么?

如果使用PrimaryKey(场地id)而不是整个模型对象,则可以使用嵌套序列化程序而不是

在您的示例中,它看起来像:

class EventCreateSerializer(serializers.ModelSerializer):
    venue = PrimaryKeyRelatedField(queryset=Venue.objects.all())

    class Meta:
        model = Event
        fields = ['id', 'name', 'venue', 'created_at', 'updated_at']
您应使用以下请求:

{
  "name": "My new event",
  "venue": "5678"
}

谢谢你的回答@philoj。我知道我需要创建单独的序列化程序和单独的视图,以区分创建和检索操作,这是否正确?是的。如果您创建一个Viewset()而不是两个视图,并重写get_serializer()方法以在“create”和“list”操作期间返回适当的序列化程序,则效果更好。您可以检查self.action的值来区分这一点。