2012-08-16 14 views
3

一個ForeignKey choicefield以一個典型的富吧例如:Django的:使用原始查詢,以限制在的ModelForm

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') 

在我的形式,我試圖限制的選擇我使用原始查詢將foreignkeyFoo劃分爲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選項嗎?

+0

哪條線引發異常?當您嘗試迭代列表時是否有例外? – sergzach 2012-08-16 15:01:29

+0

有問題的一行是:self.fields ['foo']。queryset = Bar.objects.raw(「」「 選擇f.id作爲id,f.name作爲bar_lookup(%s)中的名稱」「」,[ search_str]) – 2012-08-16 15:07:44

+0

你能告訴我模板中的行嗎? – sergzach 2012-08-16 15:08:11

回答

1

我也有類似的問題,並提出與棘手的解決方案:

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.foo_choices = Bar.objects.raw(""" 
       select f.id as id, f.name as name from bar_lookup(%s)""", [search_str]) 
     self.fields['foo'].choices = [(x.id, x) for x in self.foo_choices] 

    def clean_foo(self): 
     foo = self.cleaned_data['foo'] 
     if foo not in self.foo_choices: 
      raise forms.ValidationError("Some error!") 
     return foo 

    class Meta: 
     model = Bar 

的我知道這是不完美的,子類ModelChoiceField會更好。

+0

這就是我剛纔所做的......雖然它確實有效。 – 2012-08-16 15:05:56