0

My tables are:

# models.py
class Warehouse(models.Model):
    site_name = models.CharField(max_length=100) 

class Item(models.Model):
    item = models.CharField(max_length=100) 

class WarehouseStockStatus(models.Model):   
    site_name = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
   
    item = models.ForeignKey(Item,on_delete=models.CASCADE,editable = False) 

    class Meta:
        unique_together = (("site_name", "item")) 
    
    stock_opening_quantity = models.PositiveBigIntegerField( 
                    default = 0,  
                    editable = False
                    )
    stock_consumption_quantity = models.PositiveBigIntegerField( 
                    default = 0,  
                    editable = False
                    )    
    current_inventory_level = models.PositiveBigIntegerField( 
                    default = 0,  
                    editable = False
                    )
 
class InventoryOpenings(models.Model):      
    site_name = models.ForeignKey(Warehouse, on_delete=models.CASCADE,related_name='openings')
    transaction_number = models.BigAutoField(primary_key = True,
                  serialize = False)

class InventoryOpeningsDetails(models.Model):
        
    transaction_number = models.ForeignKey(InventoryOpenings, on_delete=models.CASCADE)
    item = models.ForeignKey(Item,on_delete=models.CASCADE)
    opening_quantity = models.PositiveBigIntegerField( 
                    default = 0,  
                    editable = True
                    )

There is one Warehouse table, with one to many records in WarehouseStockStatus. There is one products or Items table for inventory control. Then there InventoryOpenings and InventoryOpeningsDetails table, where we select the warehouse, and then an item, add the opening_quantity field.

I want to update WarehouseStockStatus for this warehouse and item combination, updating the stock_opening_quantity and current_inventory_level fields in that table, with the opening value we are inputting for InventoryOpeningsDetails.

I am trying to place the code for it in admin.py, in InventoryOpeningsAdmin. Need help.

Tried this code in admin

class InventoryOpeningsAdmin(admin.ModelAdmin):   

   def after_saving_model_and_related_inlines(self, obj):
         
        mysite = InventoryOpenings.objects.values_list('site_name',flat=True)[0]
        myitem = InventoryOpeningsDetails.objects.values_list('item', flat=True)[0]

        try:
            warehouse_item =  WarehouseStockStatus.objects.filter(Q(site_name=mysite, item=myitem)).select_related(Warehouse)   #.update_or_create(site_name=mysite, item=myitem)
        except WarehouseStockStatus.DoesNotExist:
            WarehouseStockStatus.objects.create(site_name=mysite, item=myitem)
            warehouse_item =  WarehouseStockStatus.objects.filter(Q(site_name=mysite, item=myitem)).select_related(Warehouse) 

        stock_op_qty = WarehouseStockStatus.stock_opening_quantity
        stock_cur_qty = WarehouseStockStatus.current_inventory_level
       
        op_qty = InventoryOpeningsDetails.opening_quantity
        updated_op_qty = stock_op_qty + op_qty
        updated_cur_qty = stock_cur_qty + op_qty
        warehouse_item.stock_opening_quantity = updated_op_qty
        warehouse_item.current_inventory_level = updated_cur_qty
        
        for allitems in warehouse_item:
            warehouse_item.save()

1 Answer 1

0

Something like this?, check Django Signals

from django.dispatch import receiver
from django.db.models.signals import post_save,pre_save

class Warehouse(models.Model): 
    site_name = models.CharField(max_length=100)

class Item(models.Model): 
    item = models.CharField(max_length=100)
    class Meta:
        unique_together = (("site_name", "item")) 
    stock_opening_quantity = models.PositiveBigIntegerField(default = 0,editable = False)
    stock_consumption_quantity = models.PositiveBigIntegerField(default = 0,editable = False)    
    current_inventory_level = models.PositiveBigIntegerField(default = 0,editable = False)

class WarehouseStockStatus(models.Model):
    site_name = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
    item = models.ForeignKey(Item,on_delete=models.CASCADE,editable = False)

class InventoryOpenings(models.Model):
    site_name = models.ForeignKey(Warehouse, on_delete=models.CASCADE,related_name='openings') 
    transaction_number =  models.BigAutoField(primary_key = True, serialize = False)


class InventoryOpeningsDetails(models.Model):
    transaction_number = models.ForeignKey(InventoryOpenings, on_delete=models.CASCADE)
    item = models.ForeignKey(Item,on_delete=models.CASCADE)
    opening_quantity = models.PositiveBigIntegerField(default = 0,editable = True)


@receiver(post_save,sender=InventoryOpenings)
def update_item(sender,instance,*args,**kwargs):
    item = instance.item
    item.stock_opening_quantity = instance.opening_quantity
    item.current_inventory_level = item.current_inventory_level + instance.opening_quantity
    item.save()
2
  • Thanks a lot. I got the idea, how to proceed. The opening stock value is getting inputted in InventoryOpeningsDetails table. The table to be updated is WarehouseStockStatus. And need to create a record on basis of warehouse and item, in WarehouseStockStatus, if record is not existing. Commented Apr 19 at 16:40
  • Hi All, I tried: @receiver(post_save,sender=InventoryOpeningsDetails) def update_warehousestockstatus(sender,instance,*args,**kwargs): WarehouseStockStatus.objects.filter(site_name=instance.site_name,item=instance.item).update(stock_opening_quantity=F('stock_opening_quantity') + instance.opening_quantity) WarehouseStockStatus.objects.filter(site_name=instance.site_name,item=instance.item).update(current_inventory_level=F('current_inventory_level') + instance.opening_quantity) Somehow the table is not getting updated. Commented Apr 20 at 6:47

Not the answer you're looking for? Browse other questions tagged or ask your own question.