2017-06-12 10 views
0

私は2つの異なるモデルのアプリを持っています。エラーは 'can not import name sku'です。これは循環インポートのためだと思います。私は現在の方法でモデルインポートを参照することなく、このapp.modelをまだどのように参照できますか。アプリモデルの円形インポート

モデルPurchaseOrderDetail のApp PURCHASE_ORDER

from product.models import InventoryTransaction 


class PurchaseOrderDetail(AuditMixin, models.Model): 
    purchase_order = models.ForeignKey(PurchaseOrder, 
    on_delete=models.PROTECT) 
    sku = models.ForeignKey(Sku, on_delete=models.PROTECT) 
    qty_received = models.IntegerField(default=0, null=True, blank=True) 
    reason_code = models.IntegerField(default=0, null=True, blank=True) 

    def _get_sku_code(self): 
     return self.sku.sku_code 

    def _set_sku_code(self, value): 
     tenant = self.purchase_order.tenant 
     sku = Sku.objects.get(tenant=tenant, sku_code=value) 
     self.sku = sku 

    sku_code = property(_get_sku_code, _set_sku_code) 

    def calc_received(self): 
     # calculate sum of qty_received from inventory_transactions 
     sum_quantity = InventoryTransaction.objects.filter(
      sku=self.sku, 
      po_number=self.purchase_order, 
      transaction_type='100' 
     ).aggregate(
      quantity_sum=Sum(F('quantity')) 
     ) 
     return sum_quantity 

モデルInventorytransaction アプリ製品

from purchase_order.models import PurchaseOrderDetail 


class InventoryTransaction(models.Model): 
    tenant = models.ForeignKey(Tenant) 
    po_number = models.CharField(max_length=100) 
    inventory_transaction = models.ForeignKey(PurchaseOrderInventoryTransaction) 

    def save(self, *args, **kwargs): 
     super().save(*args, **kwargs) 
     # update the PO detail with the qty_received 
     obj = PurchaseOrderDetail.objects.get(
      purchase_order=self.po_number, 
      sku=self.inventory_transaction.sku 
     ) 
     obj.qty_received = obj.calc_received() 
     obj.save() 

答えて

1

単にあなたのdef save関数内でごPurchaseOrderDetailsをインポートし、この問題が表示されないようにします。

def save(self, *args, **kwargs): from purchase_order.models import PurchaseOrderDetail ...

+0

私は実際にはこれを読む前にその権利を試してみました。ありがとうございました – user2168066

+0

もう一つのオプションは、在庫信号をPurchaseOrderDetailから切り離すために、モデル信号( 'post_save()'が明白な候補になります)を使うことです。 –