Python 在Django Rest框架中发布外键ID
我正在使用Django Rest框架开发Django API。我有两个相关实体,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
事件
和场馆
。事件发生在一个地点
通过使用嵌套序列化,我可以将以下内容返回给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的值来区分这一点。