gpt4 book ai didi

python - Django Rest Framework - 读取嵌套数据,写入整数

转载 作者:太空狗 更新时间:2023-10-29 17:02:58 24 4
gpt4 key购买 nike

到目前为止,我对 Django Rest Framework 非常满意,这就是为什么我几乎无法相信代码库中存在如此大的遗漏。希望有人知道如何支持这一点:

class PinSerializer(serializers.ModelSerializer):
item = ItemSerializer(read_only=True, source='item')
item = serializers.IntegerSerializer(write_only=True)

class Meta:
model = Pin

有目标

The goal here is to read:
{pin: item: {name: 'a', url: 'b'}}
but to write using an id
{pin: item: 10}

另一种方法是使用两个序列化程序,但这看起来是一个非常丑陋的解决方案: django rest framework model serializers - read nested, write flat

最佳答案

Django 允许您使用 item 访问 Pin 图上的项目属性,但实际上将关系存储为 item_id .您可以在序列化程序中使用此策略来解决 Python 对象不能具有两个同名属性的事实(您在代码中会遇到的问题)。

最好的方法是使用 PrimaryKeyRelatedFieldsource争论。这将确保完成正确的验证,转换 "item_id": <id>"item": <instance>在字段验证期间(紧接在序列化程序的 validate 调用之前)。这允许您在 validate 期间操作整个对象, create , 和 update方法。您的最终代码将是:

class PinSerializer(serializers.ModelSerializer):
item = ItemSerializer(read_only=True)
item_id = serializers.PrimaryKeyRelatedField(write_only=True,
source='item',
queryset=Item.objects.all())

class Meta:
model = Pin
fields = ('id', 'item', 'item_id',)

注意 1:我还删除了 source='item'在读取字段上,因为那是多余的。

注意 2:我实际上发现 Django Rest 的设置很不直观,没有指定 Item 序列化器的 Pin 序列化器返回 item_id 作为 "item": <id>而不是 "item_id": <id> ,但这不是重点。

此方法甚至可以用于正向和反向“多”关系。例如,您可以使用 pin_ids 的数组使用以下代码设置项目上的所有 Pin 图:

class ItemSerializer(serializers.ModelSerializer):
pins = PinSerializer(many=True, read_only=True)
pin_ids = serializers.PrimaryKeyRelatedField(many=True,
write_only=True,
source='pins',
queryset=Pin.objects.all())

class Meta:
model = Item
fields = ('id', 'pins', 'pin_ids',)

我之前推荐的另一种策略是使用 IntegerField直接设置 item_id .假设您使用 OneToOneField 或 ForeignKey 将 Pin 与 Item 相关联,您可以设置 item_id到一个整数而不使用 item领域。这会削弱验证,并可能因违反约束而导致数据库级错误。如果您想跳过验证数据库调用,对 ID 而不是验证/创建/更新代码中的对象有特定需求,或者需要具有相同来源的同时可写字段,这可能会更好,但我不会再推荐。整行是:

item_id = serializers.IntegerField(write_only=True)

关于python - Django Rest Framework - 读取嵌套数据,写入整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26561640/

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