如何在DRF中上传图像文件

问题描述 投票:0回答:1

如何在 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,如何使用行数据上传图像。

python django
1个回答
0
投票

我认为这里有很多地方出了问题。如果我理解得好的话,你们的用户可以有多种体验吗?如果这是真的,那么用户是主模型,体验是细节模型,并且关系应该相反(体验与用户模型有关系)。还有其他可能性,但这是最简单的一种。

那么,您没有充分利用 django 模板的潜力。不需要在视图中分配所有字段,大部分可以直接完成。

最后,如果您希望在同一页面上的模板上添加详细模型(体验)的多个实例,您可能需要查看可以轻松完成此操作的表单集。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.