Django REST API嵌套值已更新(如果存在)
我有一个Django项目,其中我有一个项目表、客户表和联系人表。项目对客户和联系人都有外键,联系人对客户有外键。我正在使用Django REST API从服务器获取数据,当我获得一个项目实例时,我希望能够看到联系人字段(至少是其中的一些字段),当我创建/更新一个项目时,我应该能够包括一个联系人。如果联系人不存在,则应创建该联系人;如果联系人确实存在,则可能会对其进行更新。我一直在尝试使用Djangos“update_或_create”,但是,如果联系人已经存在,在我进入create函数之前,我会得到一个带有“这个名字的联系人已经存在”的响应。知道为什么会这样吗 项目视图:Django REST API嵌套值已更新(如果存在),django,django-rest-framework,nested,Django,Django Rest Framework,Nested,我有一个Django项目,其中我有一个项目表、客户表和联系人表。项目对客户和联系人都有外键,联系人对客户有外键。我正在使用Django REST API从服务器获取数据,当我获得一个项目实例时,我希望能够看到联系人字段(至少是其中的一些字段),当我创建/更新一个项目时,我应该能够包括一个联系人。如果联系人不存在,则应创建该联系人;如果联系人确实存在,则可能会对其进行更新。我一直在尝试使用Djangos“update_或_create”,但是,如果联系人已经存在,在我进入create函数之前,我会
class ProjectViewSet(ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
ProjectSerializer类的示例
class ProjectSerializer(DynamicFieldsModelSerializer, ModelSerializer):
contact_person = ContactPersonSerializer(required=False)
class Meta:
model = Project
fields = '__all__'
def to_representation(self, instance):
if instance.customer:
rep['customer'] = instance.customer.name
return rep
def create(self, validated_data):
contact_person = validated_data.pop('contact_person')
contact_person, created = ContactPerson.objects.update_or_create(name=contact_person['name'],
defaults={'phone': contact_person['phone'], 'customer': Customer.objects.get(pk=contact_person['customer'].id)})
project = Project.objects.create(**validated_data, contact_person=contact_person)
return project
请求示例:
{
"id": 81142,
"name": "test_81142",
"customer": 81,
"contact_person": {
"name": "test48",
"phone": 127,
"mail": "test@mail.com",
"customer": 81
}
}
如果存在联系人,则响应:
{
"contact_person": {
"name": [
"contact person with this name already exists."
]
}
}