Передача переменной в набор запросов django

Итак, у меня есть этот набор URL-адресов ниже. И в наборе URL-адресов есть два URL-адреса, которые принимают параметры в URL-адрес и передают его в apiviw.

urlpatterns = [
    url(r'^([0-9]{4})/([0-9]{1,2})/test/$', views.DuperView.as_view()),
    url(r'^test/([0-9]{4})/([0-9]{2})/$', views.SuperView.as_view()),
    url(r'^test/', views.TestView.as_view()),
]

Вот APIView, в который все передается.

class DuperView(APIView):
    queryset = models.DuperModel.dupers.duperdeduper()

    def get(self, request, year, month, format=None):
        an_apiview = [
            year,
            month,
            ]

        return Response({'http_method': 'GET', 'api_view': an_apiview})

первый параметр, определенный в URL-адресе как ([0-9]{4}), передается в метод get как год, а второй, определенный как ([0-9]{1,2}), передается как месяц.

Вот моя модель, менеджер моделей и набор запросов модели для модели, которой все это соответствует.

class DuperQuerySet(models.QuerySet):
    def duperdeduper(self):
        return self.filter(year='2000')

class DuperModelManager(models.Manager):
    def get_queryset(self):
        return DuperQuerySet(self.model, using=self._db)

    def duperdeduper(self):
        return self.get_queryset().authors()

class DuperModel(models.Model):
    year = models.ForeignKey(YearModel)
    month = models.ForeignKey(MonthModel)
    name = models.CharField(max_length=255)

    dupers = DuperModelManager()

Мне было интересно, есть ли способ каким-то образом передать параметры года и месяца в модель, чтобы я мог использовать их при обработке данных в моделях?

SELECT * FROM dupertable, yeartable WHERE year='variablevaluepassedon'

Возможен ли такой функционал? Я знаю, что могу использовать метод .filter() в своем наборе запросов, но моя проблема заключается в том, чтобы получить переменную в наборе запросов, чтобы этот запрос работал.


person Joshua Blevins    schedule 22.06.2017    source источник
comment
Не совсем уверен, что вы спрашиваете здесь. Вы можете передать параметры в набор запросов, переопределив метод get_queryset в представлении; это то, что вы имели ввиду?   -  person Daniel Roseman    schedule 22.06.2017
comment
Нет, я не могу изменить метод get_queryset для своих нужд. Допустим, запрошенный URL-адрес — /api/1234/12/test/. Мне нужно передать 1234 и 12 в модель для обработки некоторых данных. Так что каким-то образом мне нужно получить эти точные значения из URL-адреса в APIView, а затем из APIView в модель. Я хочу, чтобы запрос принимал эти два значения в базу данных и проверял их (и, поскольку эти два значения являются внешними ключами), я затем получал бы данные из обеих моделей/таблиц базы данных, относящиеся к этим данным.   -  person Joshua Blevins    schedule 22.06.2017
comment
Я не понимаю, как это вообще связано с кодом, который вы разместили. Изначально вы говорили о месяце и году, так почему вы не можете сделать DuperModel.dupers.filter(month=self.kwargs['month], year=self.kwargs['year'])? О каких еще моделях вы говорите?   -  person Daniel Roseman    schedule 22.06.2017
comment
Итак, когда я использую метод фильтра, я могу передать их в модель? также есть self.kwargs в apiview? Я хочу узнать больше о kwargs.   -  person Joshua Blevins    schedule 22.06.2017
comment
Но я не понимаю, что вы подразумеваете под передачей их в модель? Передать что, куда - и что с этим делать?   -  person Daniel Roseman    schedule 22.06.2017


Ответы (1)


Как упомянул Даниэль, вы должны просто переопределить метод get_queryset из своего представления. Оттуда вы можете передать свои параметры, полученные из URL-адреса.

class DuperView(GenericApiView, ListModelMixin):

    def get_queryset(self):
        year = self.kwargs.get('year')
        month = self.kwargs.get('month')

        return DuperModel.dupers.filter(month=month, year=year)

Я использовал GenericApiView для добавления метода get_queryset. Затем вы можете добавить миксины, необходимые для вашего API. В этом случае я добавил ListModelMixin, реализующий метод get для получения списка элементов.

Также вы должны указать свой параметр в своих URL-адресах:

urlpatterns = [
    url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9][0-9]{1,2})/test/$', 
]
person F. Caron    schedule 22.06.2017
comment
Listapiview доступен только для чтения, будет ли это работать со стандартным apiview? - person Joshua Blevins; 23.06.2017
comment
насчет апивиев не знаю. Я обычно использовал GenericAPIView, который наследуется от Apiview. - person F. Caron; 23.06.2017
comment
Итак, поскольку GenericAPIView наследуется от APIView, нужно ли мне просто реализовать get, post, put и т. д. в моем DuperView? - person Joshua Blevins; 23.06.2017
comment
В GenericApiView часть логики реализована в миксинах (CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin и DestroyModelMixin), которые используют методы получения, отправки, размещения и т. д. и подключают их к дополнительным методам, добавленным GenericApiView. - person F. Caron; 23.06.2017
comment
Так что я должен был бы сделать дополнительные общие apiviews? Вчера я просмотрел эту страницу, когда вы упомянули GenericAPIView, но я был совершенно потерян. Я прочитаю его, а не пролистаю, как вчера. - person Joshua Blevins; 23.06.2017
comment
Я предлагаю вам использовать эти примеси, если у вас есть простая логика API. Если вам все еще нужно реализовать метод get, post, put, вам следует взглянуть на исходный код миксинов, о которых я упоминал ранее. Они довольно просты и могут быть использованы в качестве основы для того, что вы хотите сделать. Вот ссылка на документ: django-rest-framework.org /api-guide/generic-views - person F. Caron; 23.06.2017
comment
мы можем переместить это в чат, если вам нужна дополнительная информация об этом - person F. Caron; 23.06.2017
comment
Давайте продолжим обсуждение в чате. - person F. Caron; 23.06.2017