gpt4 book ai didi

python - 如何使用相关模型发布到 Django REST Framework API

转载 作者:太空狗 更新时间:2023-10-30 01:28:50 24 4
gpt4 key购买 nike

我有两个相关模型(事件 + 位置),序列化器如下所示:

class Locations
title = models.CharField(max_length=250)
address = model.CharField(max_length=250)

class Events
title = models.CharField(max_length=250)
locations = models.ForeignKey(Locations, related_name='events'

class EventsSerializer(serializers.ModelSerializer):
class Meta:
model = Events
depth = 1

我在序列化程序中将深度设置为 1,这样我就可以从 Locations 模型而不是单个 id 中获取信息。但是,这样做时,我无法发布带有位置信息的事件。我只能执行带有 title 属性的帖子。如果我删除序列化程序中的深度选项,我可以执行带有标题和位置 ID 的帖子。

我试图创建第二个没有深度场的序列化器 (EventsSerialzerB),目的是将第一个序列化器用作只读响应,但是当我创建第二个序列化器 viewset 并将其添加到路由器时,它会自动覆盖原始 View 集。

我是否可以创建一个输出相关模型字段的序列化程序,并允许您直接发布到单个模型?

//编辑 - 这是我要发布的内容

$scope.doClick = function (event) {

var test_data = {
title: 'Event Test',
content: 'Some test content here',
location: 2,
date: '2014-12-16T11:00:00Z'
}

// $resource.save() doesn't work?
$http.post('/api/events/', test_data).
success(function(data, status, headers, config) {
console.log('sucess', status);
}).
error(function(data, status, headers, config) {
console.log('error', status);
});
}

所以当序列化器是平坦的时,我可以发布所有这些字段。位置字段是相关位置表中位置的 ID。当它们嵌套时,我不能在测试数据中包含位置字段。

最佳答案

通过在序列化程序上设置 depth 选项,您告诉它使任何关系嵌套而不是平面。在大多数情况下,嵌套序列化器默认情况下应被视为只读,因为它们在 Django REST Framework 2.4 中存在错误,并且在 3.0 中有更好的方法来处理它们。

听起来您在阅读时想要嵌套表示,但在写作时想要平面表示。虽然不推荐这样做,因为这意味着 GET 请求与 PUT 请求不匹配,但可以通过一种让每个人都满意的方式来做到这一点。

在 Django REST Framework 3.0 中,您可以尝试以下方法来获得您想要的:

class LocationsSerializer(serializers.ModelSerializer):

class Meta:
model = Locations
fields = ('title', 'address', )

class EventsSerializer(serializers.ModelSerializer):
locations = LocationsSerializer(read_only=True)

class Meta:
model = Events
fields = ('locations', )

class EventViewSet(viewsets.ModelViewSet):
queryet = Event.objects.all()
serializer_class = EventsSerializer

def perform_create(self, serializer):
serializer.save(locations=self.request.data['locations'])

def perform_update(self, serializer):
serializer.save(locations=self.request.data['locations'])

创建了一个新的 LocationsSerializer,它将处理 Locations 对象的只读嵌套表示。通过覆盖 perform_createperform_update,我们可以传入与请求正文一起传入的位置 id,因此位置仍然可以更新。

另外,您应该避免使用复数形式的模型名称。当 Events.locations 是单个位置时,即使 Locations.events 是该位置的事件列表,也会让人感到困惑。 Event.locationLocation.events 看得更清楚一些,Django admin 会合理的展示它们,开发伙伴们也能很容易的理解关系是如何设置的上。

关于python - 如何使用相关模型发布到 Django REST Framework API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com