Функция обновляет каждый элемент в моей базе данных Django

Разъем драйвера не находится в вашем пути сборки. Настройте путь сборки и укажите его в «mysql-connector-java-5.1.25-bin.jar» (проверьте версию, которую вы используете). В качестве альтернативы вы можете использовать maven: D

0
задан victorR 13 July 2018 в 18:03
поделиться

2 ответа

Все ваши объекты обновляются с тем же total для каждого элемента из-за этой строки (строка 44 из actualizar_cantidad):

qs_total.update(total=s_total)

Вы определили qs_total = model.objects.values('total'), который означает каждый объект класса model, поэтому, когда вы вызываете update, вы обновляете все из них.

Чтобы исправить это, переопределите qs_total только для объекта или объектов, которые вам интересны в обновлении, используя filter, или удалите эту строку.

0
ответ дан Henry Woody 17 August 2018 в 12:19
поделиться
  • 1
    Благодарю. Могу ли я использовать что-то вроде: `qs_total.filter (pk = pk) .update (total = s_total)` для решения этой ситуации? – victorR 13 July 2018 в 18:26
  • 2
    Это будет работать, но использование get вместо filter было бы лучше в этой ситуации, так как вы заинтересованы только в получении одного объекта, а get возвращает один объект вместо набора запросов. – Henry Woody 13 July 2018 в 18:28
  • 3
    попробовал реализовать оба: qs_total.filter(pk=pk).update(total=s_total) qs_total.get(pk=pk).update(total=s_total) при использовании фильтра () обновляет только первый элемент в моей БД, используя get () , не обновляет какие-либо элементы – victorR 13 July 2018 в 18:37
  • 4
    Ах да, мой плохой. update - это метод запроса, а не объект. Поэтому вы должны использовать filter. – Henry Woody 13 July 2018 в 18:43
  • 5
    Большое вам спасибо за помощь! Ты обалденный – victorR 13 July 2018 в 19:14

О вашем вопросе qs_total.update(total=s_total) будет обновлять каждый объект, который имеет эту же общую сумму, чтобы быть конкретным и обновлять только один, вы должны передать какое-то уникальное значение в качестве id

. В этой строке кода qs_total = model.objects.values('total') Не используйте ключевое слово «model», это приходит к вам в виде текста, поэтому имя вашего класса в строке dont означает, что это экземпляр класса, вам нужно сначала его получить, а затем запустить запрос

Предложение : Я сделал что-то подобное раньше, я надеюсь, что это вам поможет, или, может быть, вы можете что-то улучшить в своем основном коде

'''
    In this version accepts only integer or decimal fields
    Parameters:
    1 - Queryset
    2 - Column Name(String)
    3 - Filter(String):
            - Less Than Equal - "-<valor>" | Example: "-250"
            - Between - "<valor>~<valor>" | Example: "250~350"
            - Greater Than Equal - "+<valor>" | Example: "+15"            
    '''

    def dinamic_filter(queryset, column, filter):
        if '-' in filter:
                filter = filter.replace('-','')
                queryset = queryset.filter(**{'{column}__lte'.format(column=column):int(filter)})
        elif '~' in filter:
            values = filter.split('~')
            if values[0] and values[1]:
                less = valores[0]
                greater = valores[1]
                queryset = queryset.filter(**{'{column}__range'.format(column=column):(less, greater)})
            else:
                raise ValidationError('Wrong Value {filter} of column {column}'.format(filter=filter, column=column))
        elif '+' in filtro:
            filter = filter.replace('+','')
            queryset = queryset.filter(**{'{column}__gte'.format(column=column):int(filter)})

        return queryset

Источник: https://github.com/Diegow3b/django -dinamic-QuerySet-фильтр

0
ответ дан Diego Vinícius 17 August 2018 в 12:19
поделиться