2016-06-21 4 views
0

のジャンゴのManyToManyFieldで文字列を使用することはできませんは値を通じて

を私が使用しようとすると、Djangoは文句属性を使用して、私のManyToManyFieldで文字列:

File "/vagrant/flamingo_env/lib/python3.4/site-packages/django/db/models/fields/related.py", line 1366, in _check_relationship_model 
    for f in through._meta.fields: 
AttributeError: 'str' object has no attribute '_meta' 

使用法:

class Voter(models.Model): 
    # ... 
    addresses = models.ManyToManyField(Address, through='voter_addresses', through_fields=('voter_id', 'address_id')) 

私はモデルを通じて作成した場合、エラーが消える:

class VoterAddress(models.Model): 
    voter_id = models.ForeignKey(Voter) 
    address_id = models.ForeignKey(Address) 

    class Meta: 
    db_table = 'voter_addresses' 

しかしもちろん、Voterが定義されていないことを訴えています。私は単に順序を変更できません。そうしないとVoterAddressも定義されません。

すべての例では、使用される基本的な文字列のバージョンがわかりました。どうしたの?

答えて

2

through引数を渡さないでください。 Djangoはあなたのために1つを作成して管理します

+1

いいね、Moses(+1) – marcusshep

+0

これは、throughパラメータがテーブル名ではなくクラス名を取ることを意味しますか? – whiterook6

+1

クラス名/モデル名。はい。あなたは明示的に名前を変更したいということを除いて、Djangoでテーブル名の管理について心配する必要はありません。 –

0

注文の問題を解決するには、ForeignKeyクラスに文字列値を指定します。

class VoterAddress(models.Model): 
    voter_id = models.ForeignKey("Voter") 
    address_id = models.ForeignKey("Address") 

    class Meta: 
     db_table = 'voter_addresses' 

これは、まだファイルに定義されていないモデルに外部キーを定義する方法です。 これを変更した場合、DjangoはVoter hasn't been definedという文句を言わないでしょう。あなたはそれがあなたが行う場合は、throughmodelを作成するために必要とされることはありませんthroughmodel

カスタムの正確な名前にする必要があり、あなたのthrough

addresses = models.ManyToManyField(Address, through='VoterAddress') 

に渡された名前を修正する必要が

+0

これはうまくいくでしょうが、私は単にManyToManyフィールドでjoinテーブル名を使うことができない理由を説明します。 – whiterook6

+0

なぜあなたの '' address__id''に2つのアンダースコアがあるのでしょうか – marcusshep

+0

Typo。一定。ありがとう。 – whiterook6

関連する問題