0

クエリにデータを投稿するときは、次のことを行っています。

fields = [
'name',
'surname',
'weight',
'height',
'position',
'agent',
'nationality',
'shirt_name',
'shirt_number',
'preferred_foot',
]

if request.method == 'POST':

    filter_spec = None
    for fld_name in fields:
        value = request.POST.get(fld_name, None)
        if value is not None:
            if fld_name == 'position':
                fld_name = 'position__in'
                value = Position.objects.filter(name=value)
            if fld_name == 'agent':
                fld_name = 'entrepreneur__in'
                value = Entrepreneur.objects.filter(name=value)
            if filter_spec is None:
                filter_spec = Q(**{fld_name: value})
            else:
                filter_spec &= Q(**{fld_name: value})
    players = Player.objects.filter(filter_spec) if filter_spec else Player.objects.none()
    result = [p.get_json() for p in players]
    py_resp = {
        'meta': {
            'total_count': len(result),
        },
        'objects': result,
    }
    json_resp = json.dumps(py_resp)
    return HttpResponse(json_resp, content_type='application/json')

クエリを配置するには、次のようにします。

Player.objects.filter(position__in=Position.objects.filter(name=positionpost))

だから私はそれがトップにあるようにしましたが、クエリは次のようになるため、国籍のコードに実装することはできません:

Player.objects.filter(country__in=Country.objects.filter(nationality__in=Nationality.objects.filter(name='Espanhola')))

そして、これを上記のコードに入れる方法がわかりません 誰かが私を助けることができますか?

4

1 に答える 1

0

両方のクエリを大幅に簡素化できます。最初は次のようになります。

Player.objects.filter(position__name=positionpost)

そして2番目:

Player.objects.filter(country__nationality__name='Espanhola')

これらは、サブクエリではなく JOIN を実行しているため、通常はより効率的です。

于 2013-10-09T13:50:00.540 に答える