2

Only save the Project model fields doesn't create the project documents model fields

Models.py

class Project(BaseModel):

name = models.CharField(max_length=100, blank=True, null=True)
class Meta:
    db_table = 'project_details'
    ordering = ['is_active']  

class ProjectDocuments(BaseModel):

file = models.FileField(upload_to="files/%Y/%m/%d")
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='projectdocuments')
class Meta:
    db_table = 'project_document_details'
    ordering = ['is_active']           

views.py:

def post(self, request, format=None):

    user_id = request.user.id
    current_date = datetime.now()
    data = copy.deepcopy(request.data)
    file_fields = list(request.FILES.values())  # list to be passed to the serializer

    data['is_active'] = True
    data['created_by'] = user_id
    data['created_date'] = current_date
    data['modified_by'] = user_id
    data['modified_date'] = current_date
    serializer = ProjectSerializer(data=data, file_fields=file_fields)
    if serializer.is_valid():
        serializer.save()

serializer.py:

class ProjectSerializer(serializers.ModelSerializer): def init(self, *args, **kwargs):

    file_fields = kwargs.pop('file_fields', None)
    super(ProjectSerializer, self).__init__(*args, **kwargs)
    if file_fields:
        field_update_dict = {str(field): serializers.FileField(required=False, write_only=True) for field in file_fields}
        print "FILE UPDATE DICT ------------>",field_update_dict
        self.fields.update(**field_update_dict)

def create(self, validated_data):
    validated_data_copy = validated_data.copy()
    validated_files = []
    for key, value in validated_data_copy.items():
        if isinstance(value, InMemoryUploadedFile):
            validated_files.append(value)
            validated_data.pop(key)
    submission_instance = super(ProjectSerializer, self).create(validated_data)
    for file in validated_files:
        ProjectDocuments.objects.create(submission=submission_instance, file=file)
    return submission_instance

class Meta:
    model = Project
    fields = '__all__'

0 Answers0