2016-06-11 4 views
0

Я переопределяю метод сохранения ModelForm. Я разбираю файл Excel и, если есть некоторые значения, я обновляю количество в объектах, связанных с экземпляром формы. Он работает в первый раз, когда экземпляр не имеет связанных объектов. Но во второй раз, когда я обновляю значения, ничего не происходит. Я не уверен, что это имеет какое-то отношение к параметру commit.Модель Django не сохраняется после вызова save()?

EDIT - Соответствующий код:

def save(self, commit=True): 
    """ 
    Overrides the save method in order to add the product inventory items listed in 
    the uploaded Excel file, if one was uploaded. 
    """ 
    inventory = super(AddOrChangeProductsInventoryForm, self).save(commit) 

    self._update_inventory_items_quantities() 

    if not commit: 
     inventory.save() 
     self.save_m2m() 

    return inventory 

def _update_inventory_items_quantities(self): 
    inventory = self.instance 

    if len(self.excel_data_dict) == 0: 
     return inventory 

    non_existing_products = [] 

    for i, product_sku in enumerate(self.excel_data_dict['SKU']): 
     quantity = self.excel_data_dict['Cantidad'][i] 
     new_item = inventory.productinventoryitem_set.filter(product__sku=product_sku).first() 

     if new_item is None: 
      product = Product.objects.filter(sku=product_sku).first() 

      if product is None: 
       # TODO: Raise warning in view 
       non_existing_products.append(product_sku) 
       continue 

      new_item = ProductInventoryItem() 
      new_item.product = product 
      new_item.inventory = inventory 

     new_item.quantity += quantity 
     # TODO: Check why after first update it's not being updated 
+0

'инвентарный = супер (AddOrChangeProductsInventoryForm, самость) .save (фиксации)' не должен он быть '.save (совершить = совершить)'? – dtgq

+0

Поскольку это единственный параметр, не подразумевается ли это его posición? – Pepedou

ответ

0

Если ваша модель имеет какие-либо много-ко-многим отношений, то вы должны быть уверены, и использовать self.save_m2m() в сочетании с методом экономии. Вот краткий пример:

# save method of your forms.ModelForm class. 
def save(self): 
    obj = super(MyModelForm, self).save(commit=False) 
    obj.save() 
    self.save_m2m() 
    return obj 
+0

Я пробовал то, что вы отправили безрезультатно. Возможно, я неправильно обновляю связанные объекты? – Pepedou

+0

@Pepedou Я бы попытался удалить аргумент 'commit = True' из вашего метода сохранения и вместо этого указать' commit = False' как аргумент в строке, где вы вызываете 'super'. Также удалите инструкцию 'if not commit' и просто пусть этот код будет выполняться каждый раз. Если эти изменения не работают, то это должно быть что-то в вашем методе '_update_inventory'. – denvaar

+0

@Pepedou также похоже, что вам нужно сделать 'new_item.save()' после того, как вы присвоите ему продукт и инвентарь. – denvaar

0

Вы сохраняете форму, когда совершение является ложным. Заменить (строка 10):

if not commit: 

с:

if commit: 

UPDATE:

new_item новая копия inventory.productinventoryitem_set.filter(product__sku=product_sku).first()

или

ProductInventoryItem() 

Это локальная переменная, и она не обновляется inventory. Все эти изменения будут уничтожены после выполнения функции. Вам необходимо сохранить изменения в inventory.

При переопределении _save_m2m в:

for obj in self.instance.productinventoryitem_set.all(): 
    obj.quantity += 2 
    obj.save() 

Тогда вы сохранения изменений перед разрушением.

Вы можете сделать что-то вроде этого:

def save(self, commit=True): 

    inventory = super(AddOrChangeProductsInventoryForm, self).save(commit) 

    self._update_inventory_items_quantities(inventory, commit) 

    return inventory 

def _update_inventory_items_quantities(self, inventory, commit): 

    if len(self.excel_data_dict) == 0: 
     return inventory 

    non_existing_products = [] 

    for i, product_sku in enumerate(self.excel_data_dict['SKU']): 
     quantity = self.excel_data_dict['Cantidad'][i] 
     new_item = inventory.productinventoryitem_set.filter(product__sku=product_sku).first() 

     if new_item is None: 
      product = Product.objects.filter(sku=product_sku).first() 

      if product is None: 
       # TODO: Raise warning in view 
       non_existing_products.append(product_sku) 
       continue 

      new_item = ProductInventoryItem() 
      new_item.product = product 
      new_item.inventory = inventory 

     new_item.quantity += quantity 
     if commit: 
      new_item.save() 
+0

Я полностью удалил это условие и все еще не изменился. – Pepedou

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