0

models.py (def save(self, *args, **kwargs) にある raw sql を使用して管理者の保存ボタンを押したときに、いくつかのレコードを更新しようとしています。

生のSQLはプロトタイプとしてこのようなものです

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

残念ながら、基準を満たすすべてのレコードが更新されるわけではありません。1つだけ、時にはそれ以上ですが、すべてではありません。

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)
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')

あなたのために仕事をするべきです!

編集: 2つのモデルがあると仮定します(生の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')

SalesOrderedItemoi_order が 1105212105 のものがすべて表示されます。

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

updateメソッドはすべての属性を更新しますoi_delivery

于 2011-05-29T19:13:05.927 に答える