Search code examples
pythondjangodjango-rest-frameworkpostman

Contacts matching query does not exist in Django rest framework


I am trying to update Contact model fields while creating the new fields of UpdateInfo model and add them to the existing model.

But I am getting this error

contacts.models.Contacts.DoesNotExist: Contacts matching query does not exist.

I know the contact object with the id 19 exists because I can see it when I try the get contacts API.

I am sending data like this:

enter image description here

My models:

class Contacts(models.Model):
   full_name = models.CharField(max_length=100, blank=True)
   .........

    def __str__(self):
        return self.full_name

    class Meta:
        verbose_name_plural = 'Potential Clients'



class UpdateInfo(models.Model):
    contacts = models.ForeignKey(Contacts,on_delete=models.CASCADE, related_name='update_info')
    updated_at = models.DateTimeField(auto_now=True)
    modified_by = models.CharField(max_length=100, blank=True)


    def __str__(self):
        return f"Last modified by {self.modified_by} at {self.updated_at}"

My views:

class EditContactView(RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Contacts.objects.all()
    serializer_class = ContactsUpdateSeializer

My serializers:

class UpdateInfoSerializer(serializers.ModelSerializer):
    contacts= serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
        model = UpdateInfo
        fields = ['id','contacts','updated_at','modified_by']


class ContactsUpdateSeializer(serializers.ModelSerializer):
    update_info = UpdateInfoSerializer(many=True)
    id = serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
        model = Contacts
        fields = ['id', 'full_name', 'lead_source', 'email', 'phone', 'contact_owner',
                  'contact_status', 'company_name', 'job_position', 'tasks',
                  'notes', 'email_list', 'created_by', 'created_at', 'update_info']


    def update(self, instance, validated_data):
        update_data = validated_data.pop('update_info')
        id = validated_data.get('id')
        contacts = Contacts.objects.get(id=id)
        #contacts.save()

        #contact_only_update_logic
        instance.full_name = validated_data.get('full_name')
        instance.lead_source = validated_data.get('lead_source')
        instance.email = validated_data.get('email')
        instance.phone = validated_data.get('phone')
        instance.contact_owner = validated_data.get('contact_owner')
        instance.contact_status = validated_data.get('contact_status')
        instance.company_name = validated_data.get('company_name')
        instance.job_position = validated_data.get('job_position')
        instance.tasks = validated_data.get('tasks')
        instance.notes = validated_data.get('notes')
        instance.email_list = validated_data.get('email_list')
        instance.save()

        #add_update_info_logic

        for update_data in update_data:
            abc = UpdateInfo.objects.create(contacts=contacts,**update_data)
            instance.update_info.add(abc)

        instance.save()
        return instance

Solution

  • You have to change your serializer

    class ContactsUpdateSeializer(serializers.ModelSerializer):
        update_info = UpdateInfoSerializer(many=True)
    
        class Meta:
            model = Contacts
            fields = ['id', 'full_name', 'lead_source', 'email', 'phone', 'contact_owner',
                      'contact_status', 'company_name', 'job_position', 'tasks',
                      'notes', 'email_list', 'created_by', 'created_at', 'update_info']
    
    
        def update(self, instance, validated_data):
            update_data = validated_data.pop('update_info')
            instance = super(ContactsUpdateSeializer, self).update(instance, validated_data)
            
            for update_datum in update_data:
                abc = UpdateInfo.objects.create(contacts=instance,**update_datum)
                
            return instance
    

    PrimaryKeyRelatedField is used for foreign key purpose and there we have to define queryset also.

    Don't need to add the updateinfo in contact, it is already done throgh django.

    Moreover, it would be better if you use bulk_create instead of running save each time if you there is no signals exists for that.

    You can do it as:-

    UpdateInfo.objects.bulk_create([UpdateInfo(contacts=instance,**update_datum) for update_datum in update_data])