Сериализатор Django не сохраняет данные в базе данных
я хочу сохранить модель в sqlite test-db, но результат сохранения - пустая строка в db с автоматически увеличивающимся индексом строки. остальная часть строки - NULL.
я потратил много времени на решение проблемы, но ничего не нашел. после вызова метода save() данные исчезли -> см. печать ниже.
ясно, что ответ выбрасывает эту ошибку - я думал, что dictObj будет автоматически преобразован в json. и я готов поспорить, что когда serilized.data будет иметь правильную форму объекта, он будет работать.
Вот код:
class Hopper(models.Model):
# Relationships
id = models.IntegerField
open_positions_count = models.TextField
name = models.TextField
exchange = models.TextField
hopper_id = models.TextField
subscription_id = models.TextField
plan_id = models.TextField
payment_term = models.TextField
payment_method_id = models.TextField
... # shortened
class HopperSerializer(serializers.ModelSerializer):
class Meta:
model = Hopper
fields = ['id',
'open_positions_count',
'name',
'exchange',
'hopper_id',
'subscription_id',
'plan_id',
'payment_term',
'payment_method_id',
... # shortened
]
Views.hopper получает объект hopperObject как jsonObject:
@api_view(('POST', 'GET'))
@csrf_exempt
def hopper(request):
if request.method == 'POST':
data = request.data
serializer = HopperSerializer(data=data)
print(serializer.initial_data)
if serializer.is_valid():
serializer.save()
print(serializer.initial_data)
print(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED) # Throws -> TypeError: Object of type type is not JSON serializable
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Первая и вторая печать одинаковы:
{'id': 'X',
'open_positions_count': 'X',
'name': 'X',
'exchange': 'X',
'hopper_id': 'X',
'subscription_id': 'X',
'plan_id': 'X',
'payment_term': 'X',
'payment_method_id': 'X',
... # shortened
}
Это последняя печать:
'id': 2, # is is the only value ( in my case the id of the incoming obj should be the id and not an auto increment id)
'open_positions_count': <class 'django.db.models.fields.TextField'>,
'name': <class 'django.db.models.fields.TextField'>,
'exchange': <class 'django.db.models.fields.TextField'>,
'hopper_id': <class 'django.db.models.fields.TextField'>,
'subscription_id': <class 'django.db.models.fields.TextField'>,
'plan_id': <class 'django.db.models.fields.TextField'>,
'payment_term': <class 'django.db.models.fields.TextField'>,
'payment_method_id': <class 'django.db.models.fields.TextField'>,
... # shortened
}
добрые пожелания
Вам нужен метод create
в вашем сериализаторе для сохранения данных:
class HopperSerializer(serializers.ModelSerializer):
class Meta:
model = Hopper
fields = ['id',
'open_positions_count',
'name',
'exchange',
'hopper_id',
'subscription_id',
'plan_id',
'payment_term',
'payment_method_id',
... # shortened
]
def create(self, validated_data):
"""
Create and return a new Hopper instance, given the validated data.
"""
return Hopper.objects.create(**validated_data)
Вчера я обнаружил, что забыл скобки в модели. Мой линтер не работает
old:
open_positions_count = models.TextField
new:
open_positions_count = models.TextField()