古典的なfoobarの例を見てみましょう:
でmodels.py
:
Class Foo(models.Model):
name = models.CharField(max_length= 200)
Class Bar(models.Model):
name = models.CharField(max_length= 200)
foo = models.ForeignKey('Foo')
私のフォームでは、自分の選択肢を生のクエリを使用するサブセットに制限しようとしforeignkey
ましたFoo
。Foo
でforms.py
:
class BarForm(ModelForm):
search_field = CharField(max_length=100, required=False)
def __init__(self,*args,**kwargs):
search_str = kwargs.pop('search_str', None)
super(BarForm,self ).__init__(*args,**kwargs)
self.fields['search_field'].initial = search_str
self.fields['foo'].queryset = Bar.objects.raw("""
select f.id as id, f.name as name from bar_lookup(%s)""", [search_str])
class Meta:
model = Bar
exclude = ('foo',)
bar_lookup(%s)
テーブルを返すDBプロシージャです。複数のリレーションを検索し、結果のフィルタリングと並べ替えを最適化された方法で処理します。それは機能し、Djangoコードで再度コーディングする必要はありません。
次のエラーが発生します:"'RawQuerySet' object has no attribute 'all'"
。Bar.objects.filter()
代わりに法線を使用すると、フォームは機能します。
どうすればRawQuerySet
普通に変身できQuerySet
ますか?オプションを使用する必要がありself.fields['line_stop'].choice
ますか?