3

別のアプリからモデルをインポートしようとして困っています。「メイン」と「管理」の 2 つのアプリがあります。ここに、冗長な説明を取り除いたコードがあります。

「管理」モデル:

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_Contract の前にある「「#」に注意してください。単にモデル コントラクトを (# なしで) インポートしようとすると、次のエラーが発生します。

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'

私はこれまでのところどこでも見て、多くのオプションを試しました..しかし、エラーはまだそこにあります...私は理解できません...循環インポートなどについて読みました...パスで参照しようとしました(ご覧のとおり)が、それはうまくいきません...

アドバイスをいただければ幸いです... thx

4

3 に答える 3

7

トレースバックは、エラーが28行ContractForm目で定義したクラスにあることを示していますadministrative/models.py

...
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は、ファイルからその1つのクラスを選択するだけではありませんadministrative/models.py。代わりに、Pythonインタープリターはファイル全体を読み取り、モジュールオブジェクトを作成し、インポートされたファイルから新しいモジュールの名前空間にコードを実行してから、名前Contractを新しいモジュールの名前空間から現在の名前空間にコピーします。したがって、モジュールから1つのクラスのみをインポートしているように見えますが、そのモジュールのどこかにエラーがあると、インポートの成功が妨げられる可能性があります。この場合、クラスのエラーContractFormです。トレースバックの残りの部分では、そのクラスで何がうまくいかなかったのかを詳しく説明します。

于 2012-05-15T13:15:40.053 に答える
1

私が間違っていない場合.契約モデルをインポートしていて、これら2つのアプリがアプリフォルダーに保存されているように見える場合は、インポート中にアプリを追加する必要があります

from apps.administrative.models import Contract

このモデルを次のように直接使用する必要があります

FK_Contract = models.ForeignKey(Contract, unique=False, blank=True, null=True, on_delete=models.SET_NULL)
于 2012-05-15T10:57:02.587 に答える
-1

この質問に投稿したコードのインデントの問題が、実際のコードで実際に発生していないことを願っています。

たとえば、次の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_toなどdate_fromですcontract詳細については、PEP 8 を確認してください。
  2. また、ForeignKey フィールドの前に「FK_」を付けるのも悪い習慣です。ただ冗長です。もちろん、これは私の意見です。何らかの命名基準を使用している可能性があります....しかし、これを避けることができれば、より良いでしょう。
  3. verbose_nameパラメータをフィールド定義に追加します。
  4. defaultフィールドの値を追加しnull=True, blank=Trueます。
  5. モデルに冗長性を持たせます (意味のある名前を付けます)。Crefcontr2num悪いものです。

それが役に立てば幸い。

于 2012-05-16T14:39:00.370 に答える