For .. in循环中没有向Django对象添加属性

时间:2017-07-24 09:38:25

标签: python django python-3.x

我正在尝试为以下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保存在数据库中。我不知道我在这里做错了什么,非常感谢任何帮助!

2 个答案:

答案 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()

你可以对循环做同样的事情。但似乎没必要。希望这可以帮助。