以经典的 foo bar 为例:
在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
选项吗?