so i have an employes collection with a bunch of data that is in this format :
{
"_id": {
"$oid": "511d0a9f181b16509ae5f7dd"
},
"nom": "Leberre",
"prenom": "Stephanie",
"anciennete": 1,
"adresse": {
"numero": 79,
"codepostal": 9500,
"ville": "Toulouse",
"rue": "Jean Moulin"
},
"tel": 559608352,
"prime": 1500
},
here is the models.py :
from django.db import models
class Employee(models.Model):
nom = models.CharField(max_length=100)
prenom = models.CharField(max_length=100)
anciennete = models.IntegerField()
adresse = models.JSONField()
tel = models.CharField(max_length=20, blank=True, null=True)
prime = models.IntegerField(blank=True, null=True)
def __str__(self):
return f"{self.nom}, {self.prenom}"
serializers.py :
from rest_framework import serializers
from .models import Employee
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
and finally views.py :
from rest_framework.response import Response
from rest_framework import generics
from .models import Employee
from .serializers import EmployeeSerializer
class EmployeeListView(generics.ListAPIView):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
def list(self, request, *args, **kwargs):
serializer = self.get_serializer(self.get_queryset(), many=True)
return Response(serializer.data)
i keep getting :"the JSON object must be str, bytes or bytearray, not OrderedDict ". i dont need a very specific solution, just any solution works even if it involves modifying all the files mentioned above
//edit
here is the settings.py file :
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-_v8lmb3--wwr@2e(4waw2636grijurf+i()(t*+eqv!bug%zqo'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'EmployeeApp'
]
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000"
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'employes.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'employes.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'employes',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
and here is the full traceback :
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/api/employes/?format=json
Django Version: 4.1.13
Python Version: 3.11.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'EmployeeApp']
Installed Middleware:
['corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 56, in inner
response = get_response(request)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/views/decorators/csrf.py", line 55, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/views/generic/base.py", line 103, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/generics.py", line 199, in get
return self.list(request, *args, **kwargs)
File "/Users/brahimkhalilkhalef/employes/EmployeeApp/views.py", line 13, in list
return Response(serializer.data)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/serializers.py", line 768, in data
ret = super().data
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/serializers.py", line 253, in data
self._data = self.to_representation(self.instance)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/rest_framework/serializers.py", line 686, in to_representation
return [
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/db/models/query.py", line 394, in __iter__
self._fetch_all()
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/db/models/query.py", line 1867, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/db/models/query.py", line 117, in __iter__
for row in compiler.results_iter(results):
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1336, in apply_converters
value = converter(value, expression, connection)
File "/Users/brahimkhalilkhalef/myenv/lib/python3.11/site-packages/django/db/models/fields/json.py", line 86, in from_db_value
return json.loads(value, cls=self.decoder)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 339, in loads
raise TypeError(f'the JSON object must be str, bytes or bytearray, '
Exception Type: TypeError at /api/employes/
Exception Value: the JSON object must be str, bytes or bytearray, not OrderedDict
You need to serialize the address field separately
Try adding this class to serialize the address json and then call this inside the EmployeeSerializer