ファイアウォールポリシーの変更要求の周りに簡単なアプリケーションを構築しています。ルールのリクエストをすべて1つのビューで作成できるように、モデルとフォームをセットアップする方法を理解するのは苦労しています。インラインフォームセットのDjango ForeignKeyの関係を理解する
ここでは、問題の根本を解決するためのモデルとフォームを簡略化したものです。 RuleRequest
からAddress
までのいくつかの外部キーを使用しています。これは、RuleRequest
が多くのソースと宛先を持つことができるという点で、1対多の関係をどのように行うのかを理解しているからです。Address
はRuleRequest
です。今のよう
# 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'.
それでは、 'RuleRequest'のソースとデスティネーションの違いをどのようにして追跡し、' RuleRequest'のインスタンスが与えられたアドレスの集合をどのように取得するのでしょうか? – lampwins
私は「違いを追跡する」という意味を理解していませんか?しかし、どのようにアドレスを取得するのですか?それはrelated_nameが来る場所です。 'myrulerequest.adress_set.all()'は、ルールに関連するすべてのアドレスを含むquerysetを提供します。 –
'address_set'は、そのリレーションのDjangoのデフォルトのrelated_nameです。もしそれをもっとエレガントなものに変更したいなら、 'related_name =" addresses "'を設定すれば、あなたのコードは 'myrulerequest.addresses.all()'のようになります。しかし、フォーム/フォームセットコードで関連する名前を使用する必要はありません。 –