Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-viewsdrf-queryset

Object of type Email is not JSON serializable, How to create or update Django model object


I'm trying to build an object from my Email model, if the 'user_email' which is a user_email = models.CharField(primary_key=True, max_length=200) already exists just update it, if it doesn't exist create a new one I show you how I create my new object.

I get the following error:

TypeError: Object of type Email is not JSON serializable

My models.py extract:

class Email(models.Model):
    user_email = models.CharField(primary_key=True, max_length=200)
    user_phone_number = models.IntegerField()
    user_device_id = models.CharField(max_length=200)#request.META.get('HTTP_DEVICE', '')
    lat = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
    lng = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
    user_address = models.CharField(max_length=200)
    creation_date = models.DateTimeField(default=None)
    email_status = models.BooleanField(default=False)
    email_score = models.IntegerField()
    valid_email = models.BooleanField(default=False)
    fraud = models.BooleanField(default=False)

My views.py extract: class UserListView(APIView): serializer_class = EmailSerializer queryset = Email.objects.all() pagination_class = StandardResultsSetPagination

    def get_serializer_class(self):
        if self.action == 'list':
            return EmailListSerializer
        return EmailSerializer
    
    def post(self, request, *args, **kwargs):
        parametros = request.POST
        email='email=' + request._full_data['user_email']
        response = UserConnector(email).get_user_data()
        obgs = response[1]['results']
        if len(obgs) == 0:
            user_email = self.request.POST.get('user_email')
            email_stat = ''
            email_scor = ''
            email_valid = ''
            frau = ''
        else:
            obg = response[1]['results'][0]

            user_email = self.request.POST.get('user_email')
            email_stat = obg.get('email_status')
            email_scor = obg.get('email_score')
            email_valid = obg.get('valid_email')
            frau = obg.get('fraud')

        NewEmail = Email(
            user_email = user_email,
            user_phone_number = self.request.POST.get('user_phone_number'),
            user_device_id = request.META.get('HTTP_DEVICE', ''),
            lat = self.request.POST.get('lat'),
            lng = self.request.POST.get('lng'),
            user_address = self.request.POST.get('user_address'),
            creation_date = timezone.now,
            email_status = email_stat,
            email_score = email_scor,
            valid_email = email_valid,
            fraud = frau
        )
        return Response(NewEmail)

I create the NewEmail Object which is an instance for the Email model, then I want to do NewEmail.save() and return Response(NewEmail) for DRF to return the JSON of the created or updated object.


Solution

  • Instance (NewEmail) cannot be passed in the Response directly. You first need to save that instance i.e NewEmail.save() and then pass that instance to your EmailSerializer serializer. And then pass that serialized response in Response.

    NewEmail.save()

    serializer = EmailSerializer(NewEmail)

    return Response(serializer.data)