В новых версиях после фитрации называется filterset_fields = ['price'] class BookViewSet(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [django_filters.rest_framework.DjangoFilterBackend] filterset_fields = ['price']
На нынешних версиях для работы фильтра во view нужно написать filterset_fields = ['price']. В уроке на более ранних версиях было filter_fields = ['price']. В drf docs это написано, но вдруг кому пригодится
@@SeniorPomidorDeveloper Огромное спасибо за отличное видео! то, что из версии к версии что-то меняется - это нормально. Этот курс по беку просто бесценен.
Ребята, если у кого будут мучения с фильтрами, как у меня. Совет: устанавливайте ту же версию django-filter, что и в видео (2.3.0), а не 22.1(которая на сегодня последняя). А также, как и автор, установите формат вывода JSON (почему-то не работает при подключенной статике drf).
Можно использовать и последнюю версию, просто необходимо добавить в приложения 'django_filters', а поле для указания полей фильтрации называется 'filterset_fields', а не 'filter_fields'. Все это есть в документации по ссылке из видео - Django REST Framework - Filtering
@@eugenebybin6403 Прочитал твой комментарий уже после всех вышеперечисленных манипуляций:)) как говорится все на своем опыте. Вначале думал, что мой пакет Django-filters встал криво...
Senior Pomidor Developer добрый день. Подскажите пожалуйста, как следует поступить в такой ситуации: У меня создана модель "Товар", в которой есть FK на другую модель. При сериализации "Товара" в поле, которое ссылается на другую модель, выводит id, а хотелось бы, чтобы выводило поле 'name'.
Нашёл решения. Их несколько. Наиболее правильным, как я считаю, является дополнительная сериализация вторичного ключа. Пример скидываю. class BrandsSerializers(ModelSerializer): class Meta: model = Brand fields = ['name'] class SmartPhonesSerializer(ModelSerializer): brand = BrandsSerializers(read_only=True) class Meta: model = SmartPhone fields = ['id', 'brand', 'name'] +++++++++++++++++++++++++++++++++++++++++ На выходе получаем : [ {"id":1,"brand":{"name":"Apple"},"name":"Apple Iphone 8 Plus"}, {"id":2,"brand":{"name":"Xiaomi"},"name":"Xiaomi A6"}, {"id":3,"brand":{"name":"Samsung"},"name":"Samsung galaxy A5"} ]
@@nikitaradionov4393 твой вариант немного неправильный. Да, ты получишь верный результат, однако такой подход неоптимизированный. У тебя вместо одного запроса будет целая серия из-за того, что ты используешь дополнительную сериализацию.В таком случае нужно обьединять таблицы и назначать ОДИН сериализатор
Да, проще всего будет ее заморозить , библиотекой freezegun , через декоратор @freeze_time("2012-01-14") Ну или через mock, написать mock.ANY вместо даты , где мы проверяем данные
Учил пайтон, SQL и прочие штуки, за Джанго боялся браться и буксовал в учебе. Как же я был не прав когда откладывал твои ролики "на потом":( Ты лучший! Понял что Джанго это не так страшно. Более того, с джанго хочется возиться, это прекрасно)
Добрый вечер а можете показать как сделать профиль пользователя с формой обратной связи чтобы форма отравляла заявку на почту пользователя который зарегистрированный на сайте
Хм. Да , вполне хороший вариант. Вообще с тестами обычно не сильно заморачиваться и тупо копируют сами данные в тест, уже отсериализованные. Тесты не обязаны быть каким-то емкими или гибкими , в отличие от кода
Присоэдиняюсь к восторженым зрителям. Урок очень класный. Уменя эсть вопрос , не буду долго росказывать что я только росбираюсь в джанго , может мой вопрос будет и очень простой. На 3.44 мин вы написали filter_backends = [DjangoFilterBackend] filter_fields = [‘praice ’] . Для меня несовсем понятен синтаксис. 1. Почиму вы не записали таким способом как в документации по джангонапример Entry.objects.filter(pub_date__year=2006). 2 [DjangoFilterBackend] что означаэт эта часть ? Что работает какойто фильтр а потом что он отфильтровал отправляет в список. И также [‘praice ’]. Это как переменная список куда отправляютса данные отфильтьтрованого списка только както подругому. Я раньше создавал переменную = список, а потом этот список фильтровал а тут акто непонятно. 3Где можна прочитать об этом. 4 ПРОСЬБА когда эсть такие моменты как filter_backends = [DjangoFilterBackend] filter_fields = [‘praice ’] вы о каждой части отдельно расесняйте: это то, от того, для того, потому. Для вас это банальные и монятные вещи а многим интересно и непонятно.
1. Я записал таким способом , по тому что этот способ максимально гибкий. Через Entity.objects.filter() было бы очень сложно и не удобно настраивать свои фильтры. 2. В filter_backends определяются классы, которые позволяют фильтровать queryset у этого view. В filter_fields определяются поля, по которым мы создаём возможность фильтровать при помощи DjangoFilterBackend. 3. Почитать об этом можно в документации DRF, я ее открывал в этом видео. Можно использовать авто-переводчик страницы на русский. 4. Я стараюсь объяснять подробно, насколько, насколько это возможно в рамках этого видео, сохраняя темп курса. Если рассказывать про устройство каждого класса то урок длился бы два часа , не думаю что это кому-то понравится , там мы написали всего две строчки .
Интересно объясняешь, мне нравится, но я не пойму зачем останавливать сервер, чтобы зайти в shell? Можно же создать ещё одну вкладку консоли) и git bash была б лучше вместо обычной в пай чарме)
Да, что-то не думал об этом . Я обычно инструментами пользуюсь только встроенными в PyCharm PE, но так как здесь вынужден использовать бесплатную версию , то работаю немного непривычно для себя , по этому получается иногда не оптимально..
Всем привет! Написал фильтр class CreatedDateFilter(filters.FilterSet): created_date_lte = django_filters.DateTimeFilter(field_name="created_date", lookup_expr='lte') class Meta: model = Catalog fields = ['id', 'name', 'version', 'short_name', 'description', 'created_date'] почему при выводе запроса /?created_date_lte=2021-07-06/ в браузере выводиться: {"created_date_lte":["Введите правильную дату и время."]}
но ведь есть же принцип, что нужно тестировать только свой код, зачем же писать тесты на фильтры, поиск и сортировку DRF? мы все равно под капот этих классов не залазим
Вообще не обязательно, но это неплохо, проверить через тест наличие фильтра в нашем viewset. Хотя-бы чтобы научится тесты писать. Когда будем делать кастумные фильтры чтобы уже был нормальный инструмент для тестирования и его понимание.
Очень классные уроки. Всё понятно, но есть незакрытые моменты. Вот как искать допустим по полю цены от 500 до 700 ? Ну это же постоянно встречается в фильтрах и такой популярный кейс совершенно не рассмотрен.
Что считается правильным - сортировать и фильтровать на стороне сервера (силами Джанго), или во фронтенде (JS, vue.js)? Объём БД не очень большой, 5 тысяч объектов. Такое ощущение что на стороне клиента будет быстрее, не нужно обращаться к БД.
Поняла, что не особо задумывалась над разницей между filter and search, особенно с применении к конкретным данным. Предположим с моей модели есть поле категория с ForeignKey (Category). Тогда, учитывая особенности Фильтрации, наверное можно во viewset-e прописать просто filter_fields = ['category'] , а не ['category_name'],т.к. фронтенд может мне переслать id категории, которую выбрал юзер.
Давно не было таких эмоций от изучения чего-то нового, как после этой лекции. После настройки поиска, когда выдало книгу Хемингуэя и книгу про него, испытал эстетическое удовольствие. Спасибо за проделанную работу, продолжайте в том же духе.
Я сделал проверку сортировки по полю price, но есть одна проблемка и не знаю как ее решить. Дело в том, что если набор цен (23,45,4) то сортировка будет неверной, потому что функция фильтрует строки. Есть ли возможность фильтровать числа в response? Код такой: def test_get_filter(self): response = self.client.get(self.url, data={'ordering': 'price'}) serializer_data = BooksSerializer([self.book_3, self.book_2, self.book_1], many=True).data serializer_data = sorted(serializer_data, key=lambda x: x['price']) self.assertEqual(serializer_data, response.data)
@@SeniorPomidorDeveloper Спасибо за ответ! Ошибся в принтах, это моя функция сортировала строки (serializer_data) Это легко поправимо. serializer_data = sorted(serializer_data, key=lambda x: float(x['price']))
Всем привет! Как отфильтровать данные??? использую django-filters Нужно: получение списка справочников, актуальных на указанную дату. Например: есть справочники 1.05.21 10.05.21 20.05.21 Как сделать что бы вводилась дата и выводились справочники созданные ранее этой даты??
Надо что-то такое django-filter.readthedocs.io/en/stable/ref/filters.html#isodatetimefilter create_date = IsoDateTimeFilter(field_name='created', lookup_expr='lte')
Добрый день. Можно задать вопрос? Почем при использовании filters.SearchFilter и DjangoFilterBackend строки запросе не конкатенируются, а заменяют друг друга. Если использовать поиск то "?search=hdd", а потом использовать фильтр "?min_price=230&max_price=650" то строка запроса фильтров заменяет строку поиска, то есть результат поиска теряется и не фильтруется. Конечно, если руками вписать "?search=hdd&min_price=230&max_price=650", то получаем ожидаемый результат. Как это можно поправить, или оставить так и пусть на клиенте собирает строку запроса как угодно?
Добрый день! Да, конечно клиент должен сам собирать эти параметры в урле, так как ему хочется. Но я не понял в чем проблема собрать такую-же строку в тестах или в браузере или где-то еще..
response = self.client.get(url, data={'ordering': 'price'}) Подскажи пожалуйста - мы ставили в браузерной строке - перед прайсом, чтобы отсортировалось по убыванию. А как сделать это в тестах? ставлю 'ordering': '-price' и 'ordering': -'price' выдаёт ошибку
просто одновременно с этим нужно поменять порядок ожидаемых значений в serializer_data на противоположный, т.к. результат будет так же перевернут "по убыванию"
Вопрос? Делаю поиск с помощью кириллицы. И регистронезависимость не работает! ( По умолчанию стоит регистронезависимый поиск! Но он тока работает для латиницы. То есть он различает букву "п" и букву "П" а хотелось бы что бы не различал. Подскажите как сделать?
@@SeniorPomidorDeveloper ага чот перерыл все не могу найти. Ну это из-за того что в url буквы преобразуются типа в такие %D0%9F . Ок ну спасибо) если появится ответ - пиши. А я буду дальше гуглить!
На 11:50 мы сделали вывод в админке id и названия для Book, но получилось не совсем красиво - просто строка с id и name. А как сделать, чтобы вывод был в виде таблицы из трех колонок: id, name и price? Или это где-то дальше будет?
Ещё можно фильтровать (по категориям там и т.д.) list_filter=('category') только сначала нужно создать модель категории=)) и классная штука в админке save_on_top=True
Когда сделал изменения в CSS и идешь в браузер смотреть результат, то для обновления страницы используй Ctrl + F5. Это Hard Refresh. Чистит кеш страницы.
Это всё хорошо и познавательно. Но как быть в случае если надо разработать API, который должен выдавать данные из некой legacy database, в которой нет primary/foreign keys от слова совсем? Как я понял, django ORM не позволит даже raw-sql выполнить. Или я неправ? У меня не получилось. Более-менее это удалось с применением sqlalchemy и Flask.
Ну для того чтобы делать raw-sql не нужен ORM, он нужен как раз чтобы их не делать. Если у вас серьезное веб-приложение, то я бы рекомендовал промигрировать базу в какой-то нормальный вид, а потом спокойно использовать ORM, такой какой нравится .
@@SeniorPomidorDeveloper Об этом я в курсе. Мигрировать или менять бд возможности нет. Если не нужен django ORM, то зачем нужен django? :) Выводить json через DRF? Но это можно сделать и без django.
@@SeniorPomidorDeveloper Согласен. Но вопрос был не об этом :) Вопрос был такой: правильно ли я понял, что при использовании django ORM не получится использовать legacy database, в которой нет prinary/foreign keys, а возможности что-то изменить в бд нет? Ранее я разрабатывал API на Flask и sqlachemy, решил в этот раз попробовать Django DRF. И в итоге не удалось реализовать задачу. Гугление вокруг этой темы пока ничего не дало. Думаю вернуться к варианту на Flask. И второй вопрос: Не планируете сделать аналогичный мини-курс по Flask ? Спасибо.
Не могу ответить на вопрос , может и получится с этой базой , тут от базы зависит, надо пробовать. Гугл тут не поможет , в любом случае это какие-то хаки и «танцы с бубном» придётся исполнять. По фласку курс не планирую делать , там и функционала то мало у него.
что использовать для работы с координатами ? есть тестовое задание и я его завалил, но для меня вопрос остается открытым. нужно было создать компонент, который бы позволил получал адрес доставки и возвращал данные зоны доставки и курьера, который привязан к этой зоне. Сложность заключалась в том, что я вообще понятия не имею как организовать сохранения координат самой зоны доставки так, чтобы при получении адреса доставки происходила проверка на принадлежность данной точки (адреса доставки) к зоне доставки. Зона должна сохраняться в виде набора координат