在 Django 中,在保存一个表中的记录时更新另一个表

问题描述 投票:0回答:1

我的桌子是:

模型.py

类仓库(models.Model): site_name = models.CharField(max_length=100)

类项目(模型.模型): item = models.CharField(max_length=100)

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

类 InventoryOpenings(models.Model):
site_name = models.ForeignKey(Warehouse, on_delete=models.CASCADE,lated_name='openings') transaction_number = models.BigAutoField(primary_key = True, 序列化=假)

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

有一张Warehouse表,WarehouseStockStatus中有一对多的记录。 有一个产品或项目表用于库存控制。 然后是InventoryOpenings和InventoryOpeningsDetails表,我们在其中选择仓库,然后选择一个商品,添加opening_quantity字段。

我想更新此仓库和物料组合的 WarehouseStockStatus,更新该表中的 stock_opening_quantity 和 current_inventory_level 字段,以及我们为 InventoryOpeningsDetails 输入的期初值。

我试图将其代码放在 InventoryOpeningsAdmin 的 admin.py 中。需要帮助。

在管理中尝试了此代码

InventoryOpeningsAdmin 类(admin.ModelAdmin):

def after_ saving_model_and_lated_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()
django django-models
1个回答
0
投票

类似这样的东西?,检查 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()
© www.soinside.com 2019 - 2024. All rights reserved.