使用Django rest框架工作保存具有外键的新对象没问题。但是我需要公开一个相关的模型属性,而不仅仅是它的pk用于列出其详细信息的应用程序。现在我在发布新对象时遇到问题,因为相关字段不仅仅是PK,而是一个对象。
现在的样子:
[
{
"id":1,
"hit":true,
"mis":false,
"lat":null,
"lon":null,
"altitude":null,
"gps_accuracy":"",
"site":{
"id":1,
"name":"Kiepersol 8",
"lat":null,
"lon":null,
"altitude":null,
"gps_accuracy":"",
"user":1
},
"species":{
"id":1,
"name":"Panicum maximum",
"grazing_value":"h",
"ecological_succesional_value":"c",
"response_to_grazing_impact":"D"
}
}
]
我想像这样保存:
hit:false, mis:true, species:2, site: 1
这是我的序列化工具:
class SpeciesSerializer(serializers.ModelSerializer):
class Meta:
model = Species
class PointSerializer(serializers.ModelSerializer):
class Meta:
model = Point
depth = 1
class SiteSerializer(serializers.ModelSerializer):
points = PointSerializer(many=True, read_only=True)
class Meta:
model = SurveySite
为了清楚起见,我需要显示相关模型的所有属性,以便在另一个应用上列出。但是在创建新的点对象时会出现问题。
我想我基本上在做一个关于POST的GET时有什么不同的深度,所以POST是持平的。
我想我可以有一个单独的序列化器来保存,但我确定htat不是这样的!
答案 0 :(得分:0)
您可以覆盖create
方法并获取相关的对象数据,创建它们并分配它们。假设您有DadSerializer
且它有child
个元素,并且您想要显示它们并允许使用dad
创建DadSerializer
实例。
class DadSerializer(serializers.ModelSerializer):
childs = ChildSerializer(many=True,read_only=True)
class Meta:
model = Dad
depth = 1
def create(self,validated_data):
childs_data = validated_data["childs"]
del(validated_data["childs"])
dad = Dad.objects.create(**validated_data)
new_childs = []
for data in childs_data:
child = Child.objects.create(**data)
new_childs.append(child)
#clear previous childs if you dont want stack them
dad.childs.clear()
dad.childs.add(new_childs)
dad.save()
return dad