Сериализация поля 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
Вернуться на верх