简体   繁体   English

在 Django Rest 框架中发布外键 ID

[英]Posting foreign key IDs in Django Rest Framework

I'm working on a Django API using Django Rest Framework.我正在使用 Django Z55276C10D84E1DF7713B441E76E1 框架开发 Django API。 I have two related entities, Event and Venue .我有两个相关的实体, EventVenue An Event takes place in a Venue.一个事件发生在一个场地。

By using nested serialization I'm able to return the following to my API users:通过使用嵌套序列化,我可以将以下内容返回给我的 API 用户:

{
  "id": "1234",
  "name": "My event",
  "venue": {
    "id": "5678",
    "name": "My venue"
  }
}

This is all as expected.这一切都在预料之中。 However, I'm now trying to POST an event and reference the venue as a parameter:但是,我现在正在尝试发布事件并将场地作为参数引用:

POST /api/events/

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

But I'm struggling to make this work.但我正在努力完成这项工作。 I'm trying both venue_id and venue as attribute names (I'd prefer _id as it would be more correct, but it wouldn't be a big deal).我正在尝试将venue_idvenue作为属性名称(我更喜欢_id ,因为它会更正确,但这没什么大不了的)。

I'm using the following serializers:我正在使用以下序列化程序:

class VenueSerializer(serializers.ModelSerializer):
    class Meta:
        model = Venue
        fields = ['id', 'name', 'created_at', 'updated_at']

class EventSerializer(serializers.ModelSerializer):
    venue = VenueSerializer()

    class Meta:
        model = Event
        fields = ['id', 'name', 'venue', 'created_at', 'updated_at']

What would be the correct approach to achieve this?实现这一目标的正确方法是什么?

If you are using PrimaryKey(the venue_id) instead of the whole model object, you may use PrimaryKeyRelatedField instead of a nested serializer.如果您使用 PrimaryKey(thevenue_id) 而不是整个 model object,您可以使用PrimaryKeyRelatedField而不是嵌套的序列化程序。

In your example, it would look like:在您的示例中,它看起来像:

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

    class Meta:
        model = Event
        fields = ['id', 'name', 'venue', 'created_at', 'updated_at']

And you shall use the request:你应该使用请求:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM