Django Can';我不能让序列化程序读取我的嵌套对象列表
我对Django还是个新手,这个问题让我毛骨悚然。我正在从外部API接收一个JSON对象。我正试图从Django那里保存到数据库。下面是JSON对象的一个示例Django Can';我不能让序列化程序读取我的嵌套对象列表,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我对Django还是个新手,这个问题让我毛骨悚然。我正在从外部API接收一个JSON对象。我正试图从Django那里保存到数据库。下面是JSON对象的一个示例 { "A bunch of Keys": "and values", "Units": [ "Year": "2020", "Make": "Jay Flight S
{
"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"
}
{
现在我遇到的问题是,当我的序列化程序启动时,我想弹出每个列表,然后将它们保存到它们自己的模块中。主表工程、单位表工程和交易表工程。但是,当尝试弹出我的部件列表时,我不断收到此错误->
零件数据=已验证的零件数据[“单位]。pop(“零件”)
(Pdb)n
TypeError:“str”对象不能解释为整数
下面是我的serialers和我的Parts和Units表,因为我有一个外键要指定附加到该表。任何帮助都会很好
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)
这是单位和零件表
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}"
我看到
单位
是一个列表。您不能执行list.pop(“某些字符串”)
。您必须执行列表[0]。弹出(“一些字符串”)
。或者对列表中的每个对象执行类似的操作。可以发布整个堆栈跟踪吗?>c:\users\shawn\documents\rvx1\rvx\evo\serializers.py(201)create()->unit\u data=validated\u data.pop(“Units”)(Pdb)n>c:\users\shawn\documents\rvx1\rvx\evo\serializers.py(202)create()->part\u data=unit\u data.pop(“Parts”)(Pdb)n TypeError:“str”对象不能解释为整数>c:\users\shawn\documents\rvx1\rvx\evo\serializers.py(202)create()->part\u data=unit\u data.pop(“Parts”)