filter using a complex query operator Q
Date: May 17th 2016
Last updated: May 17th 2016
Django offers a complex query operator "Q" to filter model objects. This allows you to create an OR statement in views.py.
Why did I need this? I needed to provide a selection of options to a user that they have either created themselves OR a core list that an admin member has provided.
views.py
# import
from django.db.models import Q
@login_required
@surfer_matches_user
def selectfins(request, surfer_id):
surfer = get_object_or_404(Surfer, pk=surfer_id)
form = FinSelectForm(request.POST or None, instance=surfer)
################## SOLUTION ###################
form.fields['fins'].queryset = Fin.objects.filter(Q(surfer=surfer) | Q(user=1))
###############################################
if form.is_valid():
form.save()
return redirect('/{}/'.format(surfer_id))
return render(request, 'surferprofile/selectfins.html',
{'surfer': surfer, 'form': form})