gpt4 book ai didi

python - Django rest framework 一对一关系

转载 作者:太空狗 更新时间:2023-10-29 20:51:36 26 4
gpt4 key购买 nike

所以我有以下模型:

class A(models.Model):
name = models.CharField()
age = models.SmallIntergerField()

class B(models.Model):
a = models.OneToOneField(A)
salary = model.IntergerField()

现在我想为那两个创建一个休息端点,因为它们是一对一的。所以我想跟随 get

{
url: 'http://localhost/customs/1/',
name: 'abc',
age: 24,
salary: 10000
}

同样,我也想创建记录和更新。请让我知道如何在 django rest framework 3 中实现这一点。

最佳答案

我刚遇到同样的问题,减少响应结构与底层模型结构的联系确实很有用。这是我的看法:

阅读很简单

Serializer fields有一个source参数,可以带点名来遍历属性。

class ABSerializer(serializers.ModelSerializer):

class Meta:
model = A
fields = ['name', 'age', 'salary']

salary = serializer.IntegerField(source='b.salary') # this is your related_name

写入是……官方不支持

经过验证的数据将显示嵌套结构,而标准的创建和更新方法将阻碍尝试将数据字典分配给 OneToOneField。好消息是您可以通过覆盖 create and update 来解决它。方法。这是一个更新示例:

class ABSerializer(serializers.ModelSerializer):

class Meta:
model = A
fields = ['name', 'age', 'salary']
related_fields = ['b']

salary = serializer.IntegerField(source='b.salary') # this is your related_name

def update(self, instance, validated_data):
# Handle related objects
for related_obj_name in self.Meta.related_fields:

# Validated data will show the nested structure
data = validated_data.pop(related_obj_name)
related_instance = getattr(instance, related_obj_name)

# Same as default update implementation
for attr_name, value in data.items():
setattr(related_instance, attr_name, value)
related_instance.save()
return super(ABSerializer,self).update(instance, validated_data)

当然,这个例子非常简单,不做任何异常处理,也不会处理嵌套更深的对象……但你明白了。

另一种选择

你也可以 create a read-write flavor of SerializerMethodField ,它会同时考虑 getter 和 setter,但是最终可能会更加冗长。

希望对您有所帮助!

关于python - Django rest framework 一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31878637/

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