我正在尝试为以下Django类创建一个新的数据库对象:
class MenuItems(models.Model):
"""Main class for food & drink menu items"""
category = models.ForeignKey(MenuCategories, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=10, decimal_places=1)
calories = models.IntegerField(null=True)
proteins = models.DecimalField(max_digits=10, decimal_places=1,
null=True)
carbs = models.DecimalField(max_digits=10, decimal_places=1,
null=True)
sugar = models.DecimalField(max_digits=10, decimal_places=1,
null=True)
fat = models.DecimalField(max_digits=10, decimal_places=1,
null=True)
saturated_fat = models.DecimalField(max_digits=10,
decimal_places=1, null=True)
sodium = models.DecimalField(max_digits=10, decimal_places=1,
null=True)
我首先使用自定义函数获取类别对象,这已经过测试并且成功运行。正如您在类定义中看到的那样,唯一必需的字段是“category”,“name”和“price”。我将以下字典发送到创建数据库对象的函数:
details = {
'category': category,
'name': 'Pizza Hawaii',
'price': 12,
'entered_details': {
'calories': 764,
'proteins': 30.4,
'carbs': 19.3,
'sugar': 16.7,
'fat': 29.6,
'saturated_fat': 9.6,
'sodium': 1560,
}
}
这是代码,它应该将所有输入的值,最重要的是,只有提供它们的可选值添加到对象:
item = MenuItems.objects.create(
category=details['category'],
name=details['name'],
price=details['price'],
)
item.save()
for detail, value in details['entered_details'].items():
item.detail = value
item.save()
当我尝试使用
调用可选值时,例如'calories'print(item.calories)
我得到'无'。所有可选值也作为Null保存在数据库中。我不知道我在这里做错了什么,非常感谢任何帮助!
答案 0 :(得分:3)
您应该使用setattr
从字符串设置属性,而不是使用点访问:
for detail, value in details['entered_details'].items():
setattr(item, detail, value)
item.save()
答案 1 :(得分:1)
首先看起来你只是在每个循环中编写变量名'item.detail = value'而不保存项目。其次,为什么循环,当你已经知道所有的值,只需像开始一样添加它们,如
item = MenuItems.objects.create(
category=details['category'],
name=details['name'],
price=details['price'],
calories = details['entered_details']['calories'],
proteins = details['entered_details']['proteins'],
etc.....
)
item.save()
你可以对循环做同样的事情。但似乎没必要。希望这可以帮助。