Как фильтровать 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
Вернуться на верх