【问题标题】:Django create_or_update model attribute command works fine but update failsDjango create_or_update 模型属性命令工作正常,但更新失败
【发布时间】:2016-02-04 13:51:52
【问题描述】:

我正在尝试编写一个 CSV 帮助程序来读取 CSV 文件并在模型中更新或创建字段。 create_or_update 查询工作正常,但它只是创建而不是更新。在更改 create_or_update 以进行更新时,它会引发错误。 CSV 助手的代码是:

def insert_books_from_dictionary(data):

    category, created = Category.objects.update_or_create(name=data['category'])
    sub_category = None

    if data['sub_category'].decode('utf-8') != '':
        sub_category, created = SubCategory.objects.update_or_create(name=data['sub_category'], category=category)

    publisher, created = Publisher.objects.update_or_create(name=data['publishers'])
    # convert strings to float

    # ToDo : Fix constraints and create a function
    # to handle data check and conversion
    try:
        price = float(data['mrp_price'])
    except ValueError:
        price = 0.0
        pass

    try:
        pages = float(data['pages'])
    except ValueError:
        pages = None
        pass
    isbn_13_str = str(data['isbn_13'])
    isbn_10_str = str(data['isbn_10'])
    image_url_str = str(data['image_url'])
    binding = 1 if data['binding'] == 'Hardboard' else 2
    book, created = Book.objects.update(title=data['title'],description=data['description'], pages=pages, binding=binding, price=price, category=category,sub_category=sub_category, edition_and_year=data['edition_and_year'],
        isbn_10=isbn_10_str, isbn_13=isbn_13_str,image_url=image_url_str)

    book.publishers.add(publisher)

    authors = re.split(",", data['authors'].decode('utf-8'))
    for author in authors:
        author, created = Author.objects.update_or_create(name=author.strip())

        book.authors.add(author)

    return dict(book_id=book.id)

它会抛出以下错误:

Traceback (most recent call last):
File "common/util/upload.py", line 18, in <module>
uploadbooks = book_upload(old_file, newfile)
File "common/util/upload.py", line 12, in book_upload
insert_seller_books_from_dictionary(req_data)
File "/home/subhajit/textnook/common/util/csv_helper.py", line 132, in    insert_seller_books_from_dictionary
book_id = insert_books_from_dictionary(data)
File "/home/subhajit/textnook/common/util/csv_helper.py", line 167, in insert_books_from_dictionary
isbn_10=isbn_10_str, isbn_13=isbn_13_str,image_url=image_url_str)
TypeError: 'long' object is not iterable

在更改更新以创建错误时不再出现。我该如何解决这个问题?

【问题讨论】:

    标签: python django csv django-models django-orm


    【解决方案1】:

    book, created = Book.objects.update(title=data['title'],description=data['description'], pages=pages, binding=binding, price=price, category=category,sub_category=sub_category, edition_and_year=data['edition_and_year'],
                isbn_10=isbn_10_str, isbn_13=isbn_13_str,image_url=image_url_str)
    

    您使用的是update,而不是update_or_create

    Book.objects.update 只更新和returns the number of rows affected,这是python 抱怨的'long' object is not iterable,因为它必须将其元素分配给元组book, created

    【讨论】:

    • 当我使用 update_or_create 时,它​​是在创建而不是更新。例如,我上传了相同的图书详细信息,只是价格发生了变化,它会创建一个新条目而不是更新它。
    • 我忽略了您打算在代码中执行的操作。如前所述,Book.objects.update 返回一个数字,而不是一个元组。查看我的更新答案
    • 所以如果我只想更新而不是创建我应该如何进行?
    • 我想你可以选择 numrows = Book.objects.update(title=...book, created = Book.objects.update_or_create(...,这取决于你需要做什么
    • 这是我一开始尝试的,但它所做的只是创建一个新条目:book, created = Book.objects.update_or_create(title=data['title'],description=data['description'], pages=pages, binding=binding, price=price, category=category,sub_category=sub_category, edition_and_year=data['edition_and_year'], isbn_10=data['isbn_10'], isbn_13=data['isbn_13'],image_url=data['image_url'])
    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多