Как фильтровать WHERE , OR на django с помощью сериализатора, модели и представления?
Я делаю запрос через GET со следующим запросом:
site.org/mymodel?ordering=-created&state=awaiting_review
и я обновил для отправки с несколькими состояниями:
site.org/mymodel?ordering=-created&state=awaiting_review,phone_screened,interview_scheduled,interview_completed,offer_made,hired,rejected
Но я не нашел в django документа, который бы указывал, как это лечить. Так что я не уверен, что делать прямо сейчас. Может быть, есть ванильный вариант того, как это сделать.
Следующие коды являются имитацией текущих. Какую функцию части django/python я должен использовать для получения отфильтрованного запроса с несколькими значениями?
нынешний тоже жалуется, бросая это в ответ.
{
"state": [
"Select a valid choice. awaiting_review,reviewed,phone_screened,interview_scheduled,interview_completed,offer_made,hired,rejected is not one of the available choices."
]
}
Нужно ли мне также изменить URL?
Model.py: `
class MyModel():
STATE_OPTIONS = (
("awaiting_review", "awaiting_review"),
("reviewed", "reviewed"),
("phone_screened", "phone_screened"),
("interview_scheduled", "interview_scheduled"),
("interview_completed", "interview_completed"),
("offer_made", "offer_made"),
("hired", "hired"),
("rejected", "rejected"),
)
state = models.CharField(
max_length=19, choices=STATE_OPTIONS, default="awaiting_review", null=False
)
Serializer.py:
class ASerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ( state )
`
view.py: `
class MyModelView(generics.ListAPIView, ProtectedResourceView):
serializer_class = ASerializer
filter_fields = ("state")
ordering_fields = ("state")
def get_queryset(self):
return MyModel.objects.filter(user=self.request.user).filter(
something_thats_not_state = self.request.query_params.get("something_thats_not_state")
)
`
Закрыть, вы можете попробовать расширить url, мне нравится делать что-то вроде этого:
scripts.js
// assuming we are sending a request via ajax:
// create a django like filter:
var filter = JSON.stringify({
state__in : ['offer_made', 'hired']
});
// add the filter as a parameter to the url:
var url = 'api/model/?filter=' + filter;
// send the request:
$.ajax({
url : url,
success : function(response) {
// do something with the response:
console.log(response)
}
});
Ваш фильтр в js выглядит так же, как фильтр django, и ваш url тогда выглядит примерно так:
.../api/model/?filter={'state__in':['offer_made','hired']}
views.py
import json
class ModelView(...):
...
def get_queryset(self):
# unpack the filter:
filter_string = self.request.GET.get('filter', {})
filter_dictionary = json.loads(filter_string)
# filter queryset:
queryset = self.queryset.filter(**filter_dictionary)
return queryset