Сериализация поля Dict внутри списка : ValueError: Невозможно присвоить "OrderedDict
Я расширяю данные JSON из моего последнего вопроса и пытаюсь сохранить их в базе данных. Модель периода содержит startDate
и endDate
, потому что объект JSON может иметь все 3, а может и один из них, поэтому я хочу сделать их опциями.
Я выполняю шаги, приведенные в документации для Записываемого вложенного представления, но мне не удается получить те же результаты
Комментированный код - это попытки, которые я предпринял, чтобы добиться сохранения данных.
Когда я пытаюсь сохранить данные, я получаю
ValueError: Невозможно присвоить "OrderedDict([('instant', '2020-09-26')])": "Cashcashequivalentsrestrictedcashandrestrictedcashequivalents.period" должен быть экземпляр "Period".
Модели:
class Basetable(models.Model):
basetable = models.AutoField(primary_key=True)
CompanyId = models.IntegerField()
class Cashcashequivalentsrestrictedcashandrestrictedcashequivalents(models.Model):
cashtable = models.AutoField(
primary_key=True)
unitRef = models.CharField(max_length=100)
value = models.CharField(max_length=100)
decimals = models.CharField(max_length=100)
basetable_id = models.ForeignKey(Basetable, on_delete=models.CASCADE)
class Period(models.Model):
period = models.AutoField(primary_key=True)
instant = models.CharField(blank=False, max_length=100, null=True)
startDate = models.CharField(blank=False, max_length=255, null=True)
endDate = models.CharField(blank=False, max_length=255, null=True)
cashcashequivalentsrestrictedcashandrestrictedcashequivalents_id = models.OneToOneField(
Cashcashequivalentsrestrictedcashandrestrictedcashequivalents, on_delete=models.CASCADE)
Serializer:
Вид:
def companyApiCall(request):
if request.method == 'GET':
jsonToUse = {
"CompanyId": "320193",
"CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents": [
{
"decimals": "-6",
"unitRef": "usd",
"period": {
"instant": "2020-09-26"
},
"value": "39789000000"
},
{
"decimals": "-6",
"unitRef": "usd",
"period": {
"instant": "2019-09-28"
},
"value": "50224000000"
},
{
"decimals": "-6",
"unitRef": "usd",
"period": {
"instant": "2018-09-29"
},
"value": "25913000000"
}
]
}
check = CashFlowSerializer(data=jsonToUse)
if (check.is_valid(raise_exception=True)):
print("ready to send to db")
check.save()
return JsonResponse(jsonToUse, safe=False)
Спасибо за время и помощь
В вашем CashFlowSerializer
попробуйте следующее (добавлены встроенные комментарии для объяснения изменений):
class CashFlowSerializer(serializers.ModelSerializer):
CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents = CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalentsSerializer(many=True)
class Meta:
model = Basetable
fields = "__all__"
def create(self, validated_data):
itemOneData = validated_data.pop('CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents')
cashflow = Basetable.objects.create(**validated_data)
for data in itemOneData:
# Pop the period data because the long-named model
# is not happy with it and cannot process it
period_data = data.pop("period")
my_long_named_obj = Cashcashequivalentsrestrictedcashandrestrictedcashequivalents.objects.create(basetable_id=cashflow, **data)
# Handle the period data and assign the newly created long-named model object
my_period_object = Period.objects.create(
cashcashequivalentsrestrictedcashandrestrictedcashequivalents_id=my_long_named_obj,
**period_data,
)
return cashflow