ОБНОВЛЕНИЕ в сыром sql не ударил все записи, хотя они соответствуют критериям - PullRequest
0 голосов
/ 29 мая 2011

Я пытаюсь обновить несколько записей, когда я нажимаю кнопку «Сохранить» в админке с помощью raw 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 и следующего SQL все отлично работает, и все записи обновляются:

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

Я думал об использовании менеджера для обновления таблицы, но я понятия не имею, как это будет работать, если не использовать статические данные, такие как «2011-05-29». В любом случае, было бы здорово понять, во-первых, как поразить все записи с помощью raw 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)

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

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

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

from django.db import transaction
transaction.commit_unless_managed()
1 голос
/ 29 мая 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()

Итак:

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

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

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

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

...