如何在 Django 中创建多种体验
def post(自我,请求): 关联公司 ID = request.data.get('关联公司') 如果 Associated_company_id 不为 None: Associated_company = get_object_or_404(ContactCompany, pk=linked_company_id) #print(关联公司.created_by.refrence_id_id,request.user.id) 如果 Associated_company.created_by.refrence_id_id != request.user.id: raise ValidationError("关联公司不属于登录用户。") # 验证电子邮件字段是否存在 #emails_data = request.data.get('电子邮件', [])
contact_data = request.data
addresses_data = contact_data.pop('addresses', [])
emails_data = contact_data.pop('emails', [])
"""if not emails_data:
raise ValidationError({'msg':"Email field is required."})"""
mobiles_data = contact_data.pop('mobiles', [])
"""if not mobiles_data:
raise ValidationError({'msg':"Mobile field is required."})"""
landlines_data = contact_data.pop('landlines', [])
relationships_data = contact_data.pop('relationships', [])
significant_dates_data = contact_data.pop('significant_dates', [])
tags_data = contact_data.pop('tags', [])
# Process photo upload
encoded_image = request.data.get('photo')
if encoded_image:
try:
decoded_image = base64.b64decode(encoded_image)
contact_data['photo'] = ContentFile(decoded_image, name='contact_photo.jpg')
except Exception as e:
return Response({'success': False, 'msg': 'Failed to decode and process photo upload.', 'status': status.HTTP_400_BAD_REQUEST})
contact_serializer = ContactSerializer(data=contact_data)
employee = Employee.objects.get(email=request.user.email)
if contact_serializer.is_valid():
existing_contacts_count = Contact.objects.filter(associated_company=associated_company_id).count()
# If there are no existing contacts, set the primary_contact field to True
if existing_contacts_count == 0:
contact_serializer.validated_data['primary_contact'] = True
contact = contact_serializer.save(created_by=employee)
for address_data in addresses_data:
address_data['contact'] = contact.id
address_serializer = ContactAddressSerializer(data=address_data)
if address_serializer.is_valid():
address_serializer.validated_data['contact_id'] = contact.id
address_serializer.validated_data['address_type_id'] = address_data['address_type']
address_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':address_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create emails
#emails_data = json.loads(emails_data)
for email_data in emails_data:
email_data['contact'] = contact.id
email_serializer = ContactEmailSerializer(data=email_data)
if email_serializer.is_valid():
email_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':email_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create mobiles
for mobile_data in mobiles_data:
mobile_data['contact'] = contact.id
mobile_serializer = MobileSerializer(data=mobile_data)
if mobile_serializer.is_valid():
mobile_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':mobile_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create landlines
for landline_data in landlines_data:
if landline_data['landline_type'] is not None and landline_data['landline_type'] != '':
landline_data['contact'] = contact.id
landline_serializer = LandlineSerializer(data=landline_data)
if landline_serializer.is_valid():
landline_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':landline_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create relationships
for relationship_data in relationships_data:
if relationship_data['relationship_type'] is not None and relationship_data['relationship_type'] != '':
relationship_data['contact'] = contact.id
relationship_serializer = RelationshipSerializer(data=relationship_data)
if relationship_serializer.is_valid():
relationship_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':relationship_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create significant dates
for significant_date_data in significant_dates_data:
if significant_date_data['date_type'] is not None and significant_date_data['date_type'] != '':
significant_date_data['contact'] = contact.id
significant_date_serializer = SignificantDateSerializer(data=significant_date_data)
if significant_date_serializer.is_valid():
significant_date_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':significant_date_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Create Tags
for tag_data in tags_data:
if tag_data['name'] is not None and tag_data['name'] != '':
tag_data['contact'] = contact.id
tag_serializer = ContactTagsSerializer(data=tag_data)
if tag_serializer.is_valid():
tag_serializer.save()
else:
contact.delete() # Delete the contact if address serializer is not valid
return Response({'success':False,'msg':tag_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
# Repeat similar logic for other nested serializers
return Response({'success':True,'data':contact_serializer.data,'msg':'Contact details created successfully','status':status.HTTP_200_OK}, status=status.HTTP_201_CREATED)
#{'success':True,'data':employee_serializer.data,'msg':'User successfully registed','status':status.HTTP_200_OK}, status=status.HTTP_201_CREATED
else:
return Response({'success':False,'msg':contact_serializer.errors,'status':status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
我有一个联系API,如何使用行数据上传图像。
我认为这里有很多地方出了问题。如果我理解得好的话,你们的用户可以有多种体验吗?如果这是真的,那么用户是主模型,体验是细节模型,并且关系应该相反(体验与用户模型有关系)。还有其他可能性,但这是最简单的一种。
那么,您没有充分利用 django 模板的潜力。不需要在视图中分配所有字段,大部分可以直接完成。
最后,如果您希望在同一页面上的模板上添加详细模型(体验)的多个实例,您可能需要查看可以轻松完成此操作的表单集。
希望这有帮助。