使用Djang从其他应用程序导入模型时出错

2024-04-29 15:05:15 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试从另一个应用程序导入模型时遇到问题。我有两个应用程序“main”和“administrative”。这里是代码,在这里我去掉了一些详细的描述:

“行政”模式:

from django.db import models
from django import forms
from django.forms import ModelForm


class Contract(models.Model):
    Code = models.CharField(max_length=50)
    Provider = models.CharField(max_length=30)
    Description = models.CharField(max_length=30)
    ActivationDate = models.DateField(blank=True, null=True)
    EndingDate = models.DateField(blank=True, null=True)
    Note = models.TextField(blank=True)
    Numbers = models.ManyToManyField('main.Number', through='Crefcontr2num')

def __unicode__(self):
    return u'%s %s' % (self.Provider, self.Description)

class Crefcontr2num(models.Model):
    Dateto = models.DateField()
    Datefrom = models.DateField()
    Contract = models.ForeignKey('Contract')
    Num = models.ForeignKey('main.Number')

“主要”型号:

from django.db import models
from endusers.models import OrderedEndUser
from django import forms
from django.forms import ModelForm, Textarea, TextInput, HiddenInput
#from administrative.models import Contract

class Device(models.Model):
    Maker = models.CharField(error_messages={'required': 'need !'})
    Model = models.CharField(max_length=30, blank=True)
    Imei = models.CharField(max_length=15, unique=True)
    Note = models.TextField(blank=True)
    ActiveState = models.BooleanField()
    AcquisitionDate = models.DateField(blank=True, null=True)
    DismissionDate = models.DateField(blank=True, null=True)
    CodInv = models.CharField(max_length=15, blank=True)
    FK_Enduser = models.ForeignKey('endusers.OrderedEndUser',unique=False, blank=True, null=True, on_delete=models.SET_NULL)
    #   FK_Contract = models.ForeignKey(administrative.Contract, unique=False, blank=True, null=True, on_delete=models.SET_NULL)

…请注意,在“设备”型号的FK协议前面和“导入”中的“35;”上方,如果我只是尝试导入(不导入)该型号的协议,则会出现以下错误:

Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0xb6f69a6c>>
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 88, in inner_run
self.validate(display_num_errors=True)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 249, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/validation.py", line 35, in get_validation_errors
for (app_name, error) in get_app_errors().items():
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 146, in get_app_errors
self._populate()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 61, in _populate
self.load_app(app_name, True)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 78, in load_app
models = import_module('.models', app_name)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/media/truecrypt1/develope/Django-1.3.1/dbMobile/../dbMobile/main/models.py", line 5, in <module>
from administrative.models import Contract #, Crefcontr2num
File "/media/truecrypt1/develope/Django-1.3.1/dbMobile/administrative/models.py", line 28, in <module>
class ContractForm(ModelForm):
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 205, in __new__
opts.exclude, opts.widgets, formfield_callback)
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 159, in fields_for_model
formfield = f.formfield(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 1155, in formfield
'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to)
AttributeError: 'str' object has no attribute '_default_manager'

我到处寻找,尝试了很多选择。。但错误仍然存在。。。我无法理解。。。我读到关于循环进口等。。。试着参考路径(你可以看到),但效果不太好。。。

任何建议都是值得赞赏的。。。 泰铢


Tags: djangoinfrompyimporttruemodelslib
3条回答

您的回溯显示错误是在第28行的administrative/models.py中定义的ContractForm

...
File "/media/truecrypt1/develope/Django-1.3.1/dbMobile/../dbMobile/main/models.py", line 5, in <module>
from administrative.models import Contract #, Crefcontr2num 
File "/media/truecrypt1/develope/Django-1.3.1/dbMobile/administrative/models.py", line 28, in <module> 
class ContractForm(ModelForm):
...

既然你的问题中没有包含这部分代码,我就不能告诉你更多了。 但是,您应该知道在Python中导入是如何工作的。当你使用

from administrative.models import Contract

Python不仅仅从administrative/models.py文件中选择一个类。相反,Python解释器读取整个文件,创建module对象,从新模块名称空间中导入的文件执行代码,然后将名称Contract从新模块的名称空间复制到当前名称空间。因此,虽然看起来您只是从模块中导入一个类,但该模块中任何地方的错误都会阻止成功导入—在您的情况下,这是类ContractForm的错误。回溯的其余部分详细说明了该类到底出了什么问题。

如果我没有错。如果你正在导入合同模型,并且这两个应用似乎保存在apps文件夹中,因此你必须在导入时添加应用

from apps.administrative.models import Contract

你应该像贝娄那样直接使用这个模型

FK_Contract = models.ForeignKey(Contract, unique=False, blank=True, null=True, on_delete=models.SET_NULL)

我只希望你在这个问题中发布的代码中的缩进问题不会在你的真实代码中偶然发生。

例如,您的administrative/models.py应该如下所示:

class Contract(models.Model):
    Code = models.CharField(max_length=50)
    Provider = models.CharField(max_length=30)
    Description = models.CharField(max_length=30)
    ActivationDate = models.DateField(blank=True, null=True)
    EndingDate = models.DateField(blank=True, null=True)
    Note = models.TextField(blank=True)
    Numbers = models.ManyToManyField('main.Number', through='Crefcontr2num')

    def __unicode__(self):
        return u'%s %s' % (self.Provider, self.Description)

class Crefcontr2num(models.Model):
    Dateto = models.DateField()
    Datefrom = models.DateField()
    Contract = models.ForeignKey('Contract')
    Num = models.ForeignKey('main.Number')

一些提示:

  1. 不要将模型字段命名为大写。Python的最佳实践是date_todate_fromcontract,等等。检查PEP 8 for details
  2. 用“FK”来表示外域也是一种不好的做法。只是多余的。当然这只是我的看法。也许你在用一些命名标准。。。。但如果你能避免,那就更好了。
  3. verbose_name参数添加到字段定义中。
  4. null=True, blank=True字段添加default值。
  5. 对你的模型要详细(给出有意义的名字)。Crefcontr2num是个糟糕的问题。

希望有帮助。

相关问题 更多 >