【问题标题】:'dict' object has not attribute 'pk' when using Django bulk_update()使用 Django bulk_update() 时,“dict”对象没有属性“pk”
【发布时间】:2021-06-10 13:47:48
【问题描述】:

我有以下代码:

obj = Products.objects.filter(dump__product_name = 'ABC, dump__product_color = 'black').values()
new_price = [100, 200, 300]

for item in range(len(obj)):
   obj[item]['price'] -= new_price[item]

Products.objects.filter(dump__product_name = 'ABC, dump__product_color = 'black').bulk_update(obj, ['price'])

但我得到了错误,Exception inside application: 'dict' has no attribute 'pk'

obj的值是这样的:

<QuerySet [{'id': 1, 'product_name': 'Acer - Laptop', 'price': 350}, 
           {'id': 1, 'product_name': 'Dell - Laptop', 'price': 450}, 
           {'id': 1, 'product_name': 'Samsung- Laptop', 'price': 650}]>

我无法弄清楚代码有什么问题。任何帮助将非常感激。提前非常感谢

【问题讨论】:

标签: python-3.x django django-models bulkupdate


【解决方案1】:

您不应使用.values(),因为这将创建字典而不是模型对象,因此无法提供模型提供的所有功能。

您可以使用:

obj = list(Products.objects.filter(
    dump__product_name = 'ABC', dump__product_color = 'black'
))
new_price = [100, 200, 300]

for item, prc in zip(obj, new_price):
   item.price -= prc

Products.objects.bulk_update(obj, ['price'])

【讨论】:

    【解决方案2】:

    QuerySet.values 方法返回一个字典序列,但 QuerySet.bulk_update 采用模型实例序列,而不是字典。您应该迭代由filter 方法返回的QuerySet 以获取可以更改的模型实例序列,并且在执行bulk_update 时也不必再次过滤,因为它是在实例上执行的特定主键:

    items = list(Products.objects.filter(dump__product_name='ABC', dump__product_color='black'))
    new_prices = [100, 200, 300]
    
    for item, new_price in zip(items, new_prices):
       item.price -= new_price
    
    Products.objects.bulk_update(items, ['price'])
    

    【讨论】:

    • 毕竟只有一种好方法可以做到这一点。 ;-)
    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多