1

Djangoで複雑な検索フォームを作成しました。

これが私のサンプルモデルです:

class student(models.Model):
   name = models.CharField(max_length=255)
   school = models.ForeignKey('school', null=True, blank=True)
class school(models.Model):
    name = models.CharField(max_length=255)

そのため、生徒は学校にFKを使用します。これはオプションである必要があるためnull=Trueblank=True使用されます。特定の学校名の生徒を検索する場合は、次のようなHTMLコードのフォームを使用します。

<input type="text" name="school_name"/>

そして、私は次のようにデータベースにクエリを実行します(例):

def search(request):
 results = student.objects.filter(
    name__icontains=request.POST.get('student_name',''),
    school__name__icontains=request.POST.get('school_name','')
     )

問題は次のとおりです。検索フォームを空のままにすると、フィルターが適用されていないため、すべての生徒が表示されます。すべての生徒が学校を設定していれば、それはうまくいきます。生徒に学校が設定されていない場合、MySQLの値は「NULL」です。空の文字列はNULLではないため、これらは見つからなかったと思います。しかし、どうすればそれを回避できますか?すべてのフィルター式の前にifステートメントを記述する必要がありますか?フィルタリングする50〜100のフィールドについて説明します。

これを解決するためのあらゆるヒントに感謝します。

4

1 に答える 1

2

次のように記述できます。

query = {
    'name__icontains': request.POST.get('student_name',''),
}
school_name = request.POST.get('school_name', None)
if school_name is not None:
    query['school__name__icontains'] = school_name
results = student.objects.filter(**query)

他のフィールドについても同様です。これは、フィールドごとに 1 つの if ステートメントを意味します。queryのキーは単なる文字列であるため、これを動的に行うこともできます。つまり、それらも計算してquery、必要に応じて追加できます。

于 2012-06-20T19:03:56.960 に答える