所以我有以下模型:
class A(models.Model):
name = models.CharField()
age = models.SmallIntergerField()
class B(models.Model):
a = models.OneToOneField(A)
salary = model.IntergerField()
现在,我想为其中的两个创建一个休止点,因为它们是一对一的。所以我想跟着去
{
url: 'http://localhost/customs/1/',
name: 'abc',
age: 24,
salary: 10000
}
相似地,我也想创建记录并进行更新。请让我知道如何在django rest框架3中实现此目标。
我刚刚遇到了同样的问题,使响应结构与基础模型结构的联系减少确实很有用。这是我的看法:
序列化程序字段具有一个source
参数,该参数可以使用点名来遍历属性。
class ABSerializer(serializers.ModelSerializer):
class Meta:
model = A
fields = ['name', 'age', 'salary']
salary = serializer.IntegerField(source='b.salary') # this is your related_name
验证后的数据将显示一个嵌套结构,而标准的create和update方法将阻止尝试将数据字典分配给OneToOneField。好消息是,您可以通过重写create和update方法来解决此问题。这是带有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)
当然,此示例非常简单,不执行任何异常处理,并且不能与更深层嵌套的对象一起使用...但是您明白了。
您还可以创建一个具有SerializerMethodField的读写样式,该样式将同时考虑getter和setter,但是最终可能会变得更加冗长。
希望能有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句