TypeError: Объект типа Vehicle не является сериализуемым в JSON

Когда я пытаюсь отфильтровать свою модель, я получаю эту ошибку:

TypeError: Object of type Vehicle is not JSON serializable 

Моя модель:

class Vehicle(models.Model):
    driver_id = models.ForeignKey(Driver,on_delete=CASCADE,unique=True,null=True, blank=True)
    make = models.CharField(max_length=150)
    model = models.CharField(max_length=150)
    plate_number = models.CharField(max_length=10,validators = [validate_plate_numberLATIN,validate_plate_numberCYRYLLIC], unique=True)
    created_at = models.DateTimeField(default=NOW)
    updated_at = models.DateTimeField(default=NOW)

    def __str__(self):
        return self.make

мой вид get, который генерирует ошибку

   def get(self,request, *args, **kwargs):
        vehicles = Vehicle.objects.values('driver_id','make','model','plate_number','created_at','updated_at')
        if request.GET.get('with_drivers') == 'yes':
            vehicles = Vehicle.objects.exclude(driver_id__isnull=True)
        data = {
            'vehicles' : list(vehicles)
        }
        return JsonResponse(data)

Проблема, с которой вы столкнулись, связана с тем, что при фильтрации вы устанавливаете vehicles в качестве отфильтрованного набора запросов. Когда вы вызываете list на этом наборе запросов, вы получаете список Vehicle моделей, которые не являются сериализуемыми.

Когда вы не фильтруете, вы получаете указанное values, и это возвращает вам dict (который является сериализуемым).

Итак, вы можете просто получить значения после фильтрации:

def get(self,request, *args, **kwargs):
    vehicles = Vehicle.objects.all()
    if request.GET.get('with_drivers') == 'yes':
        vehicles = vehicles.exclude(driver_id__isnull=True)
        
    vehicles = vehicles.values(
        'driver_id',
        'make',
        'model',
        'plate_number',
        'created_at',
        'updated_at'
    )

    data = {
        'vehicles' : list(vehicles)
    }

    return JsonResponse(data)
Вернуться на верх