从另一个应用程序导入时,导入Django模型中的错误

时间:2016-07-10 18:56:56

标签: python django django-models import importerror

我有一个名为project的应用程序,其中包含以下models.py文件(为了使代码行无效,将hastags放入代码中)

#inside project.models.py

from django.db import models

# Create your models here.
from django.db.models import signals
from django.core.urlresolvers import reverse
from django.template.defaultfilters import slugify
from django.utils import timezone
from datetime import datetime
import datetime as dt

from crm.models import Project
#from warehouse.models import Warehouse (hastagged for reason)

class UnitItem(models.Model):
    unitname=models.CharField(max_length = 10, unique=True)
    symbol=models.CharField(max_length=10, unique=True)
    slug=models.SlugField(max_length=300)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug=slugify(self.unitname)

        super(UnitItem, self).save(*args, **kwargs)

    def __str__(self):
        return self.unitname


class BOQItem(models.Model):
    project=models.ForeignKey(Project,related_name='boq_project_crm_project')
    slug=models.SlugField(max_length=300)
    code=models.CharField(max_length=300, unique=True)
    detail=models.CharField(max_length=300, unique=True)
    unit_name=models.ForeignKey(UnitItem, to_field ='unitname', related_name='boq_project_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)
    purchase_rate=models.DecimalField(max_digits=12, decimal_places=2)
    sales_rate=models.DecimalField(max_digits=12, decimal_places=2)
    freight_insurance_rate=models.DecimalField(max_digits=12, decimal_places=2)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug=slugify(self.code)

        super(BOQItem, self).save(*args, **kwargs)

    def __str__(self):
        return '%s %s' % (self.code, self.detail)


    #For Material Request
class EMRItem(models.Model):
    emr_id=models.CharField(max_length=50, unique=True)
    slug=models.SlugField(max_length=300)
    project=models.ForeignKey(Project,related_name='emr_project_crm_project')
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)
#warehouse=models.ForeignKey(Warehouse,related_name='emr_project_warehouse_warehouse')

    def save(self, *args, **kwargs):
        data="emr"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_emr_number='001'
        last_emr=type(self).objects.filter(emr_id__startswith=today_string).order_by('emr_id').last()

        if last_emr:
            last_emr_number=int(last_emr.emr_id[6:])
            next_emr_number='{0:03d}'.format(last_emr_number + 1)
        self.emr_id=data + today_string + next_emr_number

        if not self.id:
            self.slug=slugify(self.emr_id)
            self.created_on=timezone.now()

        else:
            self.edited_on=timezone.now()

        super(EMRItem, self).save(*args, **kwargs)


    def __str__(self):
        return  '%s %s %s' % (self.emr_id, self.project, self.date)




class EMRLineItem(models.Model):
    emr_no=models.ForeignKey(EMRItem, related_name='emrline_project_project_emr')

    item=models.ForeignKey(BOQItem,
                           related_name='emrline_project_project_boqitem')
    suggest_rate=models.DecimalField(max_digits=12, decimal_places=2)
    unit_name=models.ForeignKey(UnitItem, to_field ='unitname', related_name='emrline_project_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)


#For Purchase Order
class POItem(models.Model):
    po_id=models.CharField(max_length=50, unique=True)
    slug=models.SlugField(max_length=300)
    project=models.ForeignKey(Project,related_name='po_project_crm_project')
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)
#warehouse=models.ForeignKey(Warehouse,related_name='po_project_warehouse_warehouse')


    def save(self, *args, **kwargs):
        data="po"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_po_number='001'
    last_po=type(self).objects.filter(po_id__startswith=today_string).order_by('po_id').last()
        if last_po:
            last_po_number=int(last_po.po_id[6:])
            next_po_number='{0:03d}'.format(last_po_number + 1)
        self.po_id=data + today_string + next_po_number

        if not self.id:
            self.slug=slugify(self.po_id)
            self.created_on=timezone.now()
        else:
            self.edited_on=timezone.now()

        super(POItem, self).save(*args, **kwargs)

    def __str__(self):
        return  '%s %s %s' % (self.po_id, self.project, self.date)


class POLineItem(models.Model):
    po_no=models.ForeignKey(POItem, related_name='poline_project_project_po')
    item=models.ForeignKey(BOQItem, related_name='poline_project_project_boqitem')
    purchase_rate=models.DecimalField(max_digits=12, decimal_places=2)
    unit_name=models.ForeignKey(UnitItem, to_field ='unitname', related_name='poline_project_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)


class Indent(models.Model):
    indent_id=models.CharField(max_length=50, unique=True)
    slug=models.SlugField(max_length=300)
    project=models.ForeignKey(Project, related_name='indent_project_crm_project')
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)
#warehouse=models.ForeignKey(Warehouse,related_name='indent_project_warehouse_warehouse')
    delivery_address=models.CharField(max_length=500, unique=True)



    def save(self, *args, **kwargs):
        data="ind"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_indent_number='001'

        last_indent=type(self).objects.filter(
                                          indent_id__startswith=today_string)
                                          .order_by('indent_id').last()

        if last_indent:
            last_indent_number=int(last_indent.indent_id[6:])
            next_indent_number='{0:03d}'.format(last_indent_number + 1)
            self.indent_id=data + today_string + next_indent_number

        if not self.id:
            self.slug=slugify(self.indent_id)
            self.created_on=timezone.now()
        else:
            self.edited_on=timezone.now()

        super(Indent, self).save(*args, **kwargs)


class IndentLineItem(models.Model):
    indent_no=models.ForeignKey(Indent, related_name='indentline_project_project_indent')
    item=models.ForeignKey(BOQItem, related_name='indentline_project_project_boqitem') 
    unit_name=models.ForeignKey(UnitItem, to_field ='unitname', related_name='indentline_project_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)



class SalesInvoice(models.Model):
    invoice_id=models.CharField(max_length=50, unique=True)
    project=models.ForeignKey(Project, related_name='salesinvoice_project_crm_project')
    dispatch_by=models.CharField(max_length=100)
    lr_no=models.CharField(max_length=100, null=True, blank=True)
    transportner=models.CharField(max_length=300, null=True, blank=True)
    vehicle_no=models.CharField(max_length=100, null=True, blank=True)
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)

    def save(self, *args, **kwargs):
        data="invc"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_invoice_number='001'
        last_invoice=type(self).objects
                     .filter(invoice_id__startswith=today_string)
                     .order_by('invoice_id').last()

        if last_invoice:
            last_invoice_number=int(last_invoice.invoice_id[6:])
            next_invoice_number='{0:03d}'.format(last_invoice_number + 1)

        self.invoice_id=data + today_string + next_invoice_number

        if not self.id:
            self.slug=slugify(self.invoice_id)
            self.created_on=timezone.now()
        else:
            self.edited_on=timezone.now()

        super(SalesInvoice, self).save(*args, **kwargs)

class SalesLineItem(models.Model):
    item=models.ForeignKey(BOQItem, related_name='salesline_project_project_boqitem')
    unit_name=models.ForeignKey(UnitItem, to_field ='unitname', related_name='salesline_project_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)
    unit_rate=models.DecimalField(max_digits=12, decimal_places=2)

你可以在代码中看到,我从Warehouse应用程序中调用仓库模型,除非下面的代码发挥作用,否则这似乎工作正常:

  #inside warehouse.models.py
  from django.db import models

# Create your models here.
from django.db.models import signals
from django.core.urlresolvers import reverse
from django.template.defaultfilters import slugify
from datetime import datetime

from crm.models import Project
#from project.models import BOQItem, SalesInvoice, UnitItem, POItem (hashed intentionally, to check if the code is working)


class Warehouse(models.Model):
    code=models.CharField(max_length=100, unique=True)
    address=models.CharField(max_length=500)
    slug=models.SlugField(max_length=150)

#def get_absolute_url(self):
#   return reverse('master_detail', kwargs={'detail':self.slug})


    def save(self, *args, **kwargs):
        if not self.id:
            self.slug=slugify(self.code)

        super(Warehouse, self).save(*args, **kwargs)

    class Meta:
        ordering = ('code',)

    def __str__(self):
        return self.code


class AbstractStock(models.Model):
    quantity=models.DecimalField(max_digits=12, decimal_places=4)
    address=models.CharField(max_length=500)
    slug=models.SlugField(max_length=150)

    class Meta:
        abstract = True


class InventoryStock(AbstractStock):
    warehouse=models.ForeignKey(Warehouse, related_name='inventorystock_warehouse_warehouse_warehouse')
    project=models.ForeignKey(Project, related_name='inventorystock_warehouse_crm_project')
#     inventory=models.ForeignKey(BOQItem,related_name='inventorystock_warehouse_project_boq')


#def get_absolute_url(self):
#   return reverse('master_detail', kwargs={'detail':self.slug})


    def save(self, *args, **kwargs):
        if not self.id:
            self.slug=slugify(self.code)

        super(Warehouse, self).save(*args, **kwargs)

    def __str__(self):
        return '%s %s' % (self.inventory.code, self.inventory.detail)


class WIPStock(AbstractStock):
    warehouse=models.ForeignKey(Warehouse, related_name='wipstock_warehouse_warehouse_warehouse')
    project=models.ForeignKey(Project, related_name='wipstock_warehouse_crm_project')
#          inventory=models.ForeignKey(BOQItem,related_name='wipstock_warehouse_project_boq')

#def get_absolute_url(self):
#   return reverse('master_detail', kwargs={'detail':self.slug})


    def save(self, *args, **kwargs):
        if not self.id:
            self.slug=slugify(self.code)

        super(Warehouse, self).save(*args, **kwargs)

    def __str__(self):
        return '%s %s' % (self.inventory.code, self.inventory.detail)


class MRN(models.Model):
    mrn_id=models.CharField(max_length=50, unique=True)
    project=models.ForeignKey(Project, related_name='mrn_warehouse_crm_project')   
#   invoice_id=models.ForeignKey(POItem,related_name='mrn_warehouse_project_po')
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)

    def save(self, *args, **kwargs):
        data="mrn"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_mrn_number='001'

        last_mrn=type(self).objects.filter(mrn_id__startswith=today_string)
                 .order_by('mrn_id').last()

        if last_mrn:
            last_mrn_number=int(last_mrn.mrn_id[6:])
            next_mrn_number='{0:03d}'.format(last_mrn_number + 1)

        self.mrn_id=data + today_string + next_mrn_number

        if not self.id:
            self.slug=slugify(self.mrn_id)
            self.created_on=timezone.now()

        else:
            self.edited_on=timezone.now()

        super(MRN, self).save(*args, **kwargs)

    def __str__(self):
        return self.mrn_id


class MRNLineItem(models.Model):
#   item=models.ForeignKey(BOQItem,related_name='mrnline_warehouse_project_boqitem')
#unit_name=models.ForeignKey(UnitItem, to_field ='unitname',     related_name='mrnline_warehouse_project_unit')
    quantity=models.DecimalField(max_digits=12, decimal_places=4)
    purchase_rate=models.DecimalField(max_digits=12, decimal_places=2)




class DeliveryChallan(models.Model):
    dc_id=models.CharField(max_length=50, unique=True)
    project=models.ForeignKey(Project, related_name='deliverychallan_warehouse_crm_project')
#invoice_id=models.ForeignKey(SalesInvoice,related_name='deliverychallan_warehouse_project_salesinvoice')
    created_on=models.DateTimeField(null=True, blank=True)
    edited_on=models.DateTimeField(null=True, blank=True)
    warehouse=models.ForeignKey(Warehouse, related_name='deliverychallan_warehouse_warehouse_warehouse')

    def save(self, *args, **kwargs):
        data="dc"
        today=dt.date.today()
        today_string=today.strftime('%y%m%d')
        next_dc_number='001'

        last_dc=type(self).objects.filter(dc_id__startswith=today_string)
                .order_by('dc_id').last()

        if last_dc:
            last_dc_number=int(last_dc.dc_id[6:])
            next_dc_number='{0:03d}'.format(last_dc_number + 1)

        self.dc_id=data + today_string + next_dc_number

        if not self.id:
            self.slug=slugify(self.dc_id)
            self.created_on=timezone.now()
        else:
            self.edited_on=timezone.now()

        super(DeliveryChallan, self).save(*args, **kwargs)

    def __str__(self):
        return self.dc_id


class DCLineItem(models.Model):              
#item=models.ForeignKey(BOQItem, related_name='dcline_warehouse_project_boqitem') 
#unit_name=models.ForeignKey(UnitItem, to_field ='unitname',related_name='dcline_warehouse_project_unit')     

    quantity=models.DecimalField(max_digits=12, decimal_places=4)
    unit_rate=models.DecimalField(max_digits=12, decimal_places=2)

如果我做两者中的任何一件(即不是两件):

    来自projects.models的
  1. 导入BOQItem,SalesInvoice,UnitItem,POItem
    1. from warehouse.models import Warehouse
    2. 它的工作很棒。

      但是如果我同时导入它们(但是实际上使用这些导入模型的代码用于外键,那么没有循环引用的可能性)那么显示的错误是:

      ImportError: cannot import name 'POItem'
      

      为什么会发生这种情况?如何解决?

      解释用例 - 我为销售和仓库部门分开了应用程序。仓库部门创建仓库对象,这是创建由销售团队创建的Materail请求,采购发票,缩进所必需的。

      现在,仓库应用程序的库存模型应该访问销售团队要创建的工程量清单(orBoQ)(也称为物料清单或BoM),物料收据票据模型应该访问BoQ和采购订单和交货Challan(即要交付的物品清单)应该可以访问BoQ和销售发票。

      如果Django不允许,我该如何解决这个问题: 从AppP.models导入AppQ和中的A,B,C 从AppQ.models导入应用程序AppP中的X,Y,Z同时使用?

      (我不认为这是不允许的任何逻辑)

      非常感谢您的努力,我们将不胜感激。

      我有点难过,因为压痕很差,我得到了一次投票。好吧,如果你做downvote有礼貌的评论,并给出理由并提供问题的答案(我强烈地感觉,除非一个问题是偏离主题/坏的,否则不会是投票)。这种高压手段永远不会由SO和它的悲伤照顾。

      尽管如此,等待任何解决方案。谢谢。

1 个答案:

答案 0 :(得分:0)

如果你想在Django中将它用作ForeignKey,你可以这样做:

var dates = new List<DateTime>
        {
            new DateTime(2016, 01, 01),
            new DateTime(2016, 02, 01),
            new DateTime(2016, 03, 01),
            new DateTime(2016, 04, 01),
            new DateTime(2016, 05, 01)
        };

您必须使用全名并将其放在引号中 这样您就不必在python文件的顶部导入类。