関連するエンティティを表示するコンボでフォームをレンダリングしようとしています。したがって、ModelChoiceField を使用しています。
表示するエンティティを制限する必要があるまでは、このアプローチはうまく機能します。単純なクエリ式を使用しても問題なく動作しますが、生の SQL クエリを使用すると問題が発生します。
したがって、動作する私のコードは、クエリセットをフィルター式に設定します。
class ReservationForm(forms.Form):
location_time_slot = ModelChoiceField(queryset=LocationTimeSlot.objects.all(), empty_label="Select your prefered time")
def __init__(self,*args,**kwargs):
city_id = kwargs.pop("city_id") # client is the parameter passed from views.py
super(ReservationForm, self).__init__(*args,**kwargs)
# TODO: move this to a manager
self.fields['location_time_slot'].queryset = LocationTimeSlot.objects.filter(city__id = city_id )
しかし、それを生のクエリに変更すると、問題が発生し始めます。動作しないコード:
class ReservationForm(forms.Form):
location_time_slot = ModelChoiceField(queryset=LocationTimeSlot.objects.all(), empty_label="Select your prefered time")
def __init__(self,*args,**kwargs):
city_id = kwargs.pop("city_id") # client is the parameter passed from views.py
super(ReservationForm, self).__init__(*args,**kwargs)
# TODO: move this to a manager
query = """SELECT ts.id, ts.datetime_to, ts.datetime_from, ts.available_reserves, l.name, l.'order'
FROM reservations_locationtimeslot AS ts
INNER JOIN reservations_location AS l ON l.id = ts.location_id
WHERE l.city_id = %s
AND ts.available_reserves > 0
AND ts.datetime_from > datetime() """
time_slots = LocationTimeSlot.objects.raw(query, [city_id])
self.fields['location_time_slot'].queryset = time_slots
ウィジェットをレンダリングしようとしたときに発生する最初のエラーは次のとおりです。「RawQuerySet」オブジェクトには属性「all」がありません
enter link description hereのcommetsの1つのおかげで、次のようにして解決できました。
time_slots.all = time_slots.__iter__ # Dummy fix to allow default form rendering with raw SQL
しかし、フォームを投稿すると、「RawQuerySet」オブジェクトに属性「get」がありません。
ModelChoiceField で使用する RawQuerySet を準備する適切な方法はありますか?
ありがとう!