0

当我使用位于 models.py 中的原始 sql (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”这样的静态数据时这将如何工作。无论如何,首先了解如何使用原始 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)
4

2 回答 2

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()
于 2011-05-29T17:44:00.910 回答
1

您要求使用经理方法。

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属性。

于 2011-05-29T19:13:05.927 回答