使用foreignkey保存新对象 - 但列出其所有属性

时间:2015-03-04 10:43:24

标签: django django-models django-rest-framework

使用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不是这样的!

1 个答案:

答案 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