Обновление модели Django в оболочке не сохраняется - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь обновить данные существующей модели с помощью CSV.Я читаю файл и назначаю значения без проблем.

Если я пытаюсь выполнить `MyModel.update (), все работает без ошибок, но данные не сохраняются.

with open('Productosold.csv') as csvfile:
     reader = csv.DictReader(csvfile)
     for row in reader:
        p = ProductosBase.objects.filter(codigo_barra = row['codigo_barra'])
        p.region=row['region']
        p.producto_ing=row['producto_ing']
        p.packaging_ing=row['packaging_ing']
        p.precio_compra=row['precio_compra']
        p.uom=row['uom']
        p.units_inner=row['units_inner']
        p.inner_master=row['inner_master']
        p.tier=row['tier']
        p.precio_lista_internacional=row['precio_lista_internacional']
        p.update()

Я обычнозагрузить новые данные, используя метод MyModel.save(), и у вас не возникнет проблем.Теперь, если я использую это, я получаю «Queryset не имеет атрибута save».

p.save()

Если я распечатаю некоторые значения p.values, я вижу, что они правильно заполнены из файла CSV.

Что я делаю не так?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Вам нужно filter() всякий раз, когда вы ожидаете более одного объекта, который соответствует вашим критериям. Если не найдено ни одного элемента, соответствующего вашим критериям, filter() возвращает пустой набор запросов без выдачи ошибки.

Также вы можете использовать get(), но когда вы ожидаете один (и только один) предмет, который соответствует вашим критериям. Функция Get выдает ошибку, если элемент не существует или существует несколько элементов, соответствующих вашим критериям. Поэтому вы должны всегда использовать if в блоке try.. except .. или с функцией быстрого доступа, такой как get_object_or_404, чтобы правильно обрабатывать исключения. Я бы рекомендовал использовать get_object_or_404 в этом случае.

p = get_object_or_404(ProductosBase, codigo_barra=row['codigo_barra'])
0 голосов
/ 19 марта 2019

.filter всегда возвращает набор запросов, а не один экземпляр. Когда вы устанавливаете все эти значения, вы просто устанавливаете (ранее не существовавшие) атрибуты для этого объекта набора запросов; вы не устанавливаете поля в экземпляре модели. Вы должны использовать .get, чтобы получить экземпляр и сохранить его.

p = ProductosBase.objects.get(codigo_barra = row['codigo_barra'])
p.region=row['region']
...
p.save()

Однако, поскольку все столбцы в вашем CSV отображаются точно на поля модели, вы можете фактически использовать filter и update, чтобы сделать все за один раз:

for row in reader:
    ProductosBase.objects.filter(codigo_barra=row['codigo_barra']).update(**row)

и никакой остальной части кода не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...