2017-08-21 11 views
0

ファイアウォールポリシーの変更要求の周りに簡単なアプリケーションを構築しています。ルールのリクエストをすべて1つのビューで作成できるように、モデルとフォームをセットアップする方法を理解するのは苦労しています。インラインフォームセットのDjango ForeignKeyの関係を理解する

ここでは、問題の根本を解決するためのモデルとフォームを簡略化したものです。 RuleRequestからAddressまでのいくつかの外部キーを使用しています。これは、RuleRequestが多くのソースと宛先を持つことができるという点で、1対多の関係をどのように行うのかを理解しているからです。AddressRuleRequestです。今のよう

# Models 
class Address(CreatedUpdatedModel): 

    ipv4_address = IPAddressField(null=True) 


class RuleRequest(CreatedUpdatedModel): 

    sources = models.ForeignKey(Address, related_name='rule_requests_source', null=True) 
    destinations = models.ForeignKey(Address, related_name='rule_requests_destination', null=True) 


# Forms 
class AddressForm(BootstrapMixin, forms.ModelForm): 

    class Meta: 
     model = Address 
     fields = [ 
      'ipv4_address' 
     ] 


class RuleRequestForm(BootstrapMixin, forms.ModelForm): 

    sources = inlineformset_factory(RuleRequest, Address, AddressForm, fk_name='rule_requests_source') 
    destinations = inlineformset_factory(RuleRequest, Address, AddressForm, fk_name='rule_requests_destination') 

    class Meta: 
     model = RuleRequest 
     fields = [ 
      'sources', 'destinations', 
     ] 

、私が手: ValueError: 'firewall.Address' has no field named 'rule_requests_source'.

答えて

0

あなたはそれを元に戻しています。 ForeignKeyフィールドは、一対多の多くの側にある必要があります。

Addressには1つのRuleRequestしかないので、AddressにはForeignKeyフィールドが必要です。

そして、fk_nameまたはrelated_nameパラメータを渡す必要はありません。これらは他の目的で使用されています:fk_nameは、pk(id)以外のフィールドで関連モデルに参加しているときに使用されます。ここでは実行しません。Djangoはidに参加します。あなたは特別な理由があります。 related_nameは、リバースリレーションシップの名前を既定値から変更するために使用されます。これは、ここでの状況にも関係ありません。

+0

それでは、 'RuleRequest'のソースとデスティネーションの違いをどのようにして追跡し、' RuleRequest'のインスタンスが与えられたアドレスの集合をどのように取得するのでしょうか? – lampwins

+0

私は「違いを追跡する」という意味を理解していませんか?しかし、どのようにアドレスを取得するのですか?それはrelated_nameが来る場所です。 'myrulerequest.adress_set.all()'は、ルールに関連するすべてのアドレスを含むquerysetを提供します。 –

+0

'address_set'は、そのリレーションのDjangoのデフォルトのrelated_nameです。もしそれをもっとエレガントなものに変更したいなら、 'related_name =" addresses "'を設定すれば、あなたのコードは 'myrulerequest.addresses.all()'のようになります。しかし、フォーム/フォームセットコードで関連する名前を使用する必要はありません。 –

0

実際に1対多の関係は、RuleRequest.Aソースまたは宛先へのフォームのアドレスである一つのアドレスを持つことができますが、アドレスは、それらの多くを持つことができます。

関連する問題