Сохранение нескольких значений столбца с помощью цикла for в Django - PullRequest
0 голосов
/ 04 января 2019

В моей базе данных (SQLite) я хотел бы обновить каждый столбец в данной строке, используя цикл for в словаре. Я искал документацию SO и Django, но не смог найти никакой информации об обновлении нескольких столбцов с помощью цикла for. Я подозреваю, что есть простое решение моей проблемы, но у меня не хватает ключевых слов для Google.

Вот очень простой пример, который сводит проблему к своей сути:

models.py

from django.db import models

class author_ratings(models.Model):
    name = models.TextField()
    book_one = models.IntegerField()
    book_two = models.IntegerField()
    book_three = models.IntegerField()

views.py

from models import author_ratings

ratings_dictionary = {'book_one': 10, 'book_two': 20, 'book_three': 30}

current_author = author_ratings.objects.filter(name="Jim")

for book,rating in ratings_dictionary:
    current_author.book = rating
    current_author.save()

Проблема: вместо сохранения значений 10, 20 и 30 в соответствующие столбцы строки этого автора Джанго выдает следующую ошибку:

"AttributeError: у объекта 'current_author' нет атрибута 'book'"

EDIT: В ответах ниже Шафикур Рахман правильно указывает, что «книга» не является доступным полем (доступны только «имя», «book_one», «book_two» и «book_three»). У меня возникает вопрос: как использовать цикл for для обновления каждого поля без необходимости жестко их кодировать?

Например, я хочу избежать необходимости явно вводить каждый столбец:

current_author.book_one = ratings_dictionary['book_one']
current_author.book_two = ratings_dictionary['book_two']
current_author.book_three = ratings_dictionary['book_three']
current_author.save()

Приведенной выше информации должно быть достаточно, чтобы полностью понять вопрос, но я могу предоставить любые другие детали по запросу. Заранее благодарю за любую помощь.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

В views.py вы можете:

from models import author_ratings

ratings_dictionary = {'book_one': 10, 'book_two': 20, 'book_three': 30}

current_author = author_ratings.objects.filter(name="Jim")

current_author.update(**ratings_dictionary)

Вы можете прочитать о update в документации .

0 голосов
/ 04 января 2019

С current_author = author_ratings.objects.filter(name="Jim") вы получите QuerySet, а не экземпляр модели. Так что, делая

   current_author.book_one = ratings_dictionary['book_one']
   current_author.book_two = ratings_dictionary['book_two']
   current_author.book_three = ratings_dictionary['book_three']
   current_author.save()

вы все равно получите ошибки. 'QuerySet' object has no attribute 'save' как минимум.

Но у наборов запросов есть метод update, который может сэкономить вам несколько строк кода, если вы не настаиваете на использовании цикла:

current_author.update(**ratings_dictionary) все, что вам нужно

0 голосов
/ 04 января 2019

Ваша модель author_ratings не имеет поля book, поэтому ошибка Доступные поля: name, book_one, book_two и book_three

...