2013-04-08 3 views
3

Я хотел бы знать, есть ли способ выполнить пакетное обновление поля в модели со значением из поиска.Django: Обновить поля из поиска в одном вызове .update()

Пусть эта модель:

class Product(models.Model): 
    price = models.DecimalField(... field params here ...) 
    ... more fields here ... 

class ShopcartProductEntry(models.Model): 
    oncommit_price = models.DecimalField(
     ... field params here, similar to price params ...) 
    quantity = models.IntegerField(... field params, doesn't matter here ...) 
    product = models.ForeignKey(Product, null=False) 
    shopcart = models.ForeignKey(
        Shopcart, null=False, related_name='entries', ... more params ...) 

class Shopcart(models.Model): 
    ... fields here ... 

    def commit(self): 
     pass #my question will come in this method 

Как говорит доктор, если я пишу:

def commit(self): 
     self.entries.update(oncommit_price=F('product__price')) 

Джанго будет плакать. Как я могу выполнить этот запрос? В настоящее время я перебираю каждую запись. Мне это не нравится.

ответ

1

В крайнем случае, вы всегда можете написать свой собственный SQL запрос UPDATE:

sql = ''' UPDATE myapp_shopcartproductentry SPE 
      JOIN myapp_product P ON P.id = SPE.product_id 
      SET SPE.oncommit_price = P.price 
      WHERE SPE.shopcart_id = %s ''' 

И затем выполнить его непосредственно с помощью custom SQL transaction:

def commit(self): 
    sql = ''' ... SQL as above ... ''' 
    from django.db import connection, transaction 
    cursor = connection.cursor() 
    cursor.execute(sql, [self.id]) 
    transaction.commit_unless_managed() 
+0

спасибо. stackoverflow никогда не уведомлял меня об этом ответе. лучше поздно, чем никогда: p. закладки этой страницы ... –

Смежные вопросы