I am still new to Django and I'm ripping my hair out with this issue. I am receiving a JSON object from an external API. That I'm trying to save to our DB from Django. Here is an example of the JSON object.
{
"A bunch of Keys": "and values",
"Units": [
"Year": "2020",
"Make": "Jay Flight SLX",
"ETC" : "ETC"
"Parts": [
{
"DealerId": "",
"MajorUnitPartsId": 10187618,
"PartNumber": "06-0544",
"SupplierCode": "672",
"Qty": 1,
"Cost": 37.95,
"Price": 0.0,
"Retail": 37.95,
"SetupInstall": "I",
"Description": "20# PROPANE COVER BLACK",
"dealstate": 5,
"internaltype": 2
},
{
"DealerId": "",
"MajorUnitPartsId": 9637201,
"PartNumber": "0274320",
"SupplierCode": "JAY",
"Qty": 1,
"Cost": 0.92,
"Price": 4.99,
"Retail": 4.99,
"SetupInstall": "I",
"Description": "BATTEN,HENDRIX BEACH .88X8' CP2",
"dealstate": 5,
"internaltype": 4
},
]
"Trade": [
{
"DealerId": "",
"StdMake": "COBRA",
"StdModel": "31",
"StdYear": "1993",
"StdCategory": "",
"allowance": 3000.0,
"acv": 500.0,
"payoff": 0.0,
"lienholder": "",
"modelname": "",
"unitclass": "C",
"color": "",
"odometer": 0,
"manufacturer": "PASSPORT",
"note": "",
"unittype": "CLASS C"
}
{
Now the issue I am running into is when my serializer kicks in I want to pop each list and then save them to their own modules. The main table works, The Unit table works and the Trade table works. However when trying to pop my Parts list I keep getting this error -> part_data = validated_data["Units"].pop("Parts") (Pdb) n TypeError: 'str' object cannot be interpreted as an integer
Below is my serialers and my tables for Parts and Units because I do have a foreign key to specify to be attached to that table. Any help would be great!
class SalesDealDetailUnitsPartsSerializer(serializers.ModelSerializer):
class Meta:
model = SalesDealDetailUnitsParts
fields = ['DealerId', "PartNumber", "SupplierCode", "Qty", "Cost", "Price", "Retail", "SetupInstall", "Description", "dealstate", "internaltype"]
depth = 1
class SalesDealDetailUnitsSerializer(serializers.ModelSerializer):
Parts = SalesDealDetailUnitsPartsSerializer(many=True)
class Meta:
model = SalesDealDetailUnits
fields = '__all__'
depth = 1
class SalesDealDetailTradeSerializer(serializers.ModelSerializer):
class Meta:
model = SalesDealDetailTrade
fields = '__all__'
depth = 1
class SalesDealDetailSerializer(serializers.ModelSerializer):
Trade = SalesDealDetailTradeSerializer(many=True)
Units = SalesDealDetailUnitsSerializer(many=True)
class Meta:
model = SalesDealDetail
fields = '__all__'
def create(self, validated_data):
pdb.set_trace()
unit_data = validated_data.pop("Units")
part_data = unit_data.pop("Parts")
trade_data = validated_data.pop("Trade")
sales_deal = SalesDealDetail.objects.create(**validated_data)
for unit in unit_data:
SalesDealDetailUnits.objects.create(SalesDeal=sales_deal, **unit)
for part in part_data:
SalesDealDetailUnitsParts.objects.create(Parts=unit_data, **part)
# for stuff in unit_data:
# part_data = unit_data.pop('Parts')
# each_item_instance = SalesDealDetailUnits.objects.create(SalesDeal=sales_deal, **stuff)
# for parts in part_data:
# SalesDealDetailUnitsParts.objects.create(DealUnit=unit, **parts)
for trade in trade_data:
SalesDealDetailTrade.objects.create(SalesDeal=sales_deal, **trade)
return sales_deal
def update(self, instance, validated_data):
unit_data = validated_data.pop('Units')
units = (instance.Units).all()
units = list(units)
part_data = unit_data.pop('Parts')
parts = (instance.Units.Parts).all()
parts = list(parts)
trade_data = validated_data.pop('Trade')
trades = (instance.Trade).all()
trades = list(trade)
[setattr(instance, k, v) for k, v in validated_data.items()]
instance.save()
for u in unit_data:
try:
pk = u.get('DealUnitId')
unit = SalesDealDetailUnits.objects.get(DealUnitId=pk)
[setattr(unit, k, v) for k, v in unit.items()]
unit.save()
except:
SalesDealDetailUnits.objects.create(SalesDeal=instance, **unit)
for p in part_data:
try:
pk = p.get('PartNumber')
part = SalesDealDetailUnitsParts.objects.get(PartNumber=pk)
[setattr(part, k, v) for k, v in p.items()]
part.save()
except:
SalesDealDetailUnitsParts.objects.create(DealUnit=u, **part)
for t in trade_data:
try:
pk = t.get('DealTradeId')
trade = SalesDealDetailTrade.objects.get(DealTradeId=pk)
[setattr(trade, k, v) for k, v in trade.items()]
trade.save()
except:
SalesDealDetailTrade.objects.create(SalesDeal=instance, **trade)
Here is the Units and Parts Tables
class SalesDealDetailUnits(models.Model):
SalesDeal = models.ForeignKey(SalesDealDetail, related_name='Units', on_delete=models.CASCADE)
DealerId = models.CharField(max_length=255, blank=True, null=True)
DealUnitId = models.IntegerField(primary_key=True)
Newused = models.CharField(max_length=255, blank=True, null=True)
Year = models.CharField(max_length=255, blank=True, null=True)
Make = models.CharField(max_length=255, blank=True, null=True)
Model = models.CharField(max_length=255, blank=True, null=True)
VIN = models.CharField(max_length=255, blank=True, null=True)
Class = models.CharField(max_length=255, blank=True, null=True)
Unitprice = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
mucost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Freight = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Freightcost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Handling = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Handlingcost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
LicFees = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
LicFeesCost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Totaccy = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Totinstall = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Tradeall = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Tradeacv = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Accycost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Installcost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
docfees = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
actualcost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
DateReceived = models.DateTimeField(blank=True, null=True)
servcont = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
sccost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
propliab = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
plcost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
PackAmt = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
HoldbackAmt = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
unittype = models.CharField(max_length=255, blank=True, null=True)
SalesType = models.CharField(max_length=255, blank=True, null=True)
UnitSoldPrice = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitSoldCost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
TotalPartsAmount = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
DaysInStore = models.IntegerField(blank=True, null=True)
UnitLine1 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine2 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine3 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine4 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine5 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine6 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine7 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine8 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine9 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine10 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine11 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine12 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine13 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine14 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine15 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine16 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine17 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine18 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine19 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine20 = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine1cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine2cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine3cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine4cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine5cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine6cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine7cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine8cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine9cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine10cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine11cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine12cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine13cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine14cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine15cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine16cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine17cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine18cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine19cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
UnitLine20cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Color = models.CharField(max_length=255, blank=True, null=True)
Odometer = models.CharField(max_length=255, blank=True, null=True)
stocknumber = models.CharField(max_length=255, blank=True, null=True)
deposit = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
bodytype = models.CharField(max_length=255, blank=True, null=True)
enginenumber = models.CharField(max_length=255, blank=True, null=True)
cylinders = models.CharField(max_length=255, blank=True, null=True)
gvwr = models.CharField(max_length=255, blank=True, null=True)
fueltype = models.CharField(max_length=255, blank=True, null=True)
majorunitsalescategory = models.CharField(max_length=255, blank=True, null=True)
Vehicletaxtotal = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Taxableamounttotal = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Totaltax = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
servcontterm = models.IntegerField(blank=True, null=True)
unitline4term = models.CharField(max_length=255, blank=True, null=True)
unitline5term = models.CharField(max_length=255, blank=True, null=True)
unitline6term = models.CharField(max_length=255, blank=True, null=True)
unitline10term = models.CharField(max_length=255, blank=True, null=True)
unitline11term = models.CharField(max_length=255, blank=True, null=True)
unitline12term = models.CharField(max_length=255, blank=True, null=True)
plateno = models.CharField(max_length=255, blank=True, null=True)
customerunitid = models.IntegerField(blank=True, null=True)
packageid = models.IntegerField(blank=True, null=True)
unitid = models.CharField(max_length=255, blank=True, null=True)
modelname = models.CharField(max_length=255, blank=True, null=True)
# Parts = models.ManyToManyField(SalesDealDetailUnitsParts, related_name='Parts')
def __str__(self):
return f"{self.DealUnitId}"
class SalesDealDetailUnitsParts(models.Model):
Unit = models.ForeignKey(SalesDealDetailUnits, related_name='Parts', default="",
on_delete=models.CASCADE)
DealerId = models.CharField(max_length=255, blank=True, null=True)
PartNumber = models.CharField(max_length=255, primary_key=True)
SupplierCode = models.CharField(max_length=255, blank=True, null=True)
Qty = models.IntegerField(blank=True, null=True)
Cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Price = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
Retail = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
SetupInstall = models.CharField(max_length=255, blank=True, null=True)
Description = models.CharField(max_length=255, blank=True, null=True)
dealstate = models.IntegerField(blank=True, null=True)
internaltype = models.IntegerField(blank=True, null=True)
def __str__(self):
return f"{self.PartNumber}"