ОБНОВЛЕНИЕ в необработанном sql не попадает во все записи, хотя они соответствуют критериям

Я пытаюсь обновить несколько записей, когда нажимаю кнопку сохранения в админке с необработанным sql, который находится в models.py(def save(self, *args, **kwargs)

Необработанный sql выглядит как прототип

cursor=connection.cursor()
cursor.execute("UPDATE sales_ordered_item SET oi_delivery = %s WHERE oi_order_id = %s", ['2011-05-29', '1105212105'])

К сожалению, он не обновляет все записи, соответствующие критериям. Только один, а иногда и больше, но никогда не все.

С SQLite Manager и следующим SQL все отлично работает и все записи обновляются:

UPDATE sales_ordered_item
SET oi_delivery = '2011-05-29'
WHERE oi_order_id = '1105212105'

Я думал об использовании менеджера для обновления таблицы, но понятия не имею, как это будет работать, если не использовать статические данные, такие как «2011-05-29». В любом случае, было бы здорово сначала понять, как поразить все записи с помощью необработанного sql. Любые рекомендации, как решить проблемы по-другому, также высоко ценятся.

Вот код, который я немного урезал, чтобы он был коротким

# Orders of the customers
class Order(models.Model):
"""
Defines the order data incl. payment, shipping and delivery
"""
# Main Data
o_customer = models.ForeignKey(Customer, related_name='customer',
verbose_name=_u'Customer'), help_text=_(u'Please select the related Customer'))
o_id = models.CharField(_(u'Order ID'), max_length=10, primary_key=True,
                             help_text=_(u'ID has the format YYMMDDHHMM'))
o_date = models.DateField(_(u'created'))

and more...

# Order Item
class Ordered_item(models.Model):
"""
Defines the ordered item to which order it belongs, pricing is decoupled from the 
catalogue to be free of any changes in the pricing. Pricing and description is copied
from the item catalogue as a proposal and can be altered
"""
oi_order = models.ForeignKey(Order, related_name='Order', verbose_name=_(u'Order ID'))
oi_pos = models.CharField(_('Position'), max_length=2, default='01')
oi_quantity = models.PositiveIntegerField(_('Quantity'), default=1)

# Date of the delivery to determine the status of the item: ordered or already delivered
oi_delivery = models.DateField(_(u'Delivery'), null=True, blank=True)

and more ...

def save(self, *args, **kwargs):

    # does not hit all records, use static values for test purposes
    cursor=connection.cursor()
    cursor.execute("UPDATE sales_ordered_item SET oi_delivery = %s WHERE oi_order_id = %s", ['2011-05-29', '1105212105'])

    super(Ordered_item, self).save(*args, **kwargs)

person Helmut    schedule 29.05.2011    source источник
comment
Может быть, вы могли бы разместить свой код здесь? Вы пытаетесь переопределить метод save в своей модели? Трудно догадаться, что вы пытаетесь сделать.   -  person jazz    schedule 30.05.2011


Ответы (2)


Вероятно, это происходит из-за того, что вы не фиксируете транзакцию (см. https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly)

Добавьте эти строки после вашего cursor.execute:

from django.db import transaction
transaction.commit_unless_managed()
person ygneo    schedule 29.05.2011

Вы просили метод менеджера.

SalesOrderedItem.objects.filter(oi_order='1105212105').update(oi_delivery='2011-05-29')

должен сделать работу за вас!

Редактировать: я предполагаю, что у вас есть две модели (я угадываю этот код из вашего необработанного SQL):

class OiOrder(models.Model):
    pass

class SalesOrderedItem(models.Model):
    oi_order = models.ForeignKey(OiOrder)
    oi_delivery = models.DateField()

So:

SalesOrderedItem.objects.filter(oi_order='1105212105')

дает вам все SalesOrderedItem, которые имеют oi_order 1105212105.

   ... update(oi_delivery='2011-05-29')

Метод update обновляет все атрибуты oi_delivery.

person jazz    schedule 29.05.2011
comment
Могу ли я получить подробную информацию, пожалуйста, как реализовать. - person Helmut; 30.05.2011
comment
Спасибо, я понял строку, но я не уверен, где ее разместить. Разве вам не нужно создавать класс менеджера и иметь в модели objects = somemanager()? - person Helmut; 30.05.2011
comment
Нет, если вы определили свою модель, как указано выше. Вы можете получить к нему доступ отовсюду. - person jazz; 30.05.2011