В новых версиях после фитрации называется 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 Огромное спасибо за отличное видео! то, что из версии к версии что-то меняется - это нормально. Этот курс по беку просто бесценен.
Давно не было таких эмоций от изучения чего-то нового, как после этой лекции. После настройки поиска, когда выдало книгу Хемингуэя и книгу про него, испытал эстетическое удовольствие. Спасибо за проделанную работу, продолжайте в том же духе.
Учил пайтон, SQL и прочие штуки, за Джанго боялся браться и буксовал в учебе. Как же я был не прав когда откладывал твои ролики "на потом":( Ты лучший! Понял что Джанго это не так страшно. Более того, с джанго хочется возиться, это прекрасно)
Ребята, если у кого будут мучения с фильтрами, как у меня. Совет: устанавливайте ту же версию 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 твой вариант немного неправильный. Да, ты получишь верный результат, однако такой подход неоптимизированный. У тебя вместо одного запроса будет целая серия из-за того, что ты используешь дополнительную сериализацию.В таком случае нужно обьединять таблицы и назначать ОДИН сериализатор
Поняла, что не особо задумывалась над разницей между filter and search, особенно с применении к конкретным данным. Предположим с моей модели есть поле категория с ForeignKey (Category). Тогда, учитывая особенности Фильтрации, наверное можно во viewset-e прописать просто filter_fields = ['category'] , а не ['category_name'],т.к. фронтенд может мне переслать id категории, которую выбрал юзер.
Добрый вечер а можете показать как сделать профиль пользователя с формой обратной связи чтобы форма отравляла заявку на почту пользователя который зарегистрированный на сайте
Очень классные уроки. Всё понятно, но есть незакрытые моменты. Вот как искать допустим по полю цены от 500 до 700 ? Ну это же постоянно встречается в фильтрах и такой популярный кейс совершенно не рассмотрен.
Да, проще всего будет ее заморозить , библиотекой freezegun , через декоратор @freeze_time("2012-01-14") Ну или через mock, написать mock.ANY вместо даты , где мы проверяем данные
Присоэдиняюсь к восторженым зрителям. Урок очень класный. Уменя эсть вопрос , не буду долго росказывать что я только росбираюсь в джанго , может мой вопрос будет и очень простой. На 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. Я стараюсь объяснять подробно, насколько, насколько это возможно в рамках этого видео, сохраняя темп курса. Если рассказывать про устройство каждого класса то урок длился бы два часа , не думаю что это кому-то понравится , там мы написали всего две строчки .
Здравствуйте, подскажите пожалуйста, написал тест для сортировки, а он помимо выдуманных данных, которые мы прописывали в setUp, берет и данные из базы данных. Проверил остальные тесты, они тоже берут значения из базы данных. Не понимаю как такое возможно, ведь ниже вы писали: "В тесте проверяется то, что там создается . Так это работает, так задумано"
Здравствуйте! Это может быть если в настройках в адресе тестовой базы вы написали адрес основной. Или наоборот. По умолчанию такого не должно быть. А тестовая база должна называться как основная + «_test». Как вариант, если что-то перепуталось то можно придумать какой новое название тестовой базы и прописать в конфигурации
@@SeniorPomidorDeveloper , подскажите пожалуйста, где изменить настройки адреса тестовой базы данных. Пересмотрел последние 3 видео и не нашел где вы настраиваете тестовую базу данных, а дело в том, что я делал все как вы. Единственное отличие: у меня windows и соответственно я дописал import django import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.settings") django.setup()
@@SeniorPomidorDeveloper, в общем и целом, я смог решить данную проблему и оставлю решение здесь, вдруг у кого-то возникнет такая же проблема. Вы были правы, по умолчанию тестовая база данных создается сама, и я даже проверил в PgAdmin, она у меня даже создавалась, но не использовалась. Я пробовал добавлять поле 'TEST'{'NAME': 'test_book_db', но это не помогло, помогло только создание нового файла 'test_settings.py' в котором прописал: from .settings import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'test_books_db', 'USER': 'books_user', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } } а потом добавил ссылку на этот файл в файле test_api.py: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.test_settings") Спасибо вам!!!
Добрый день. Можно задать вопрос? Почем при использовании filters.SearchFilter и DjangoFilterBackend строки запросе не конкатенируются, а заменяют друг друга. Если использовать поиск то "?search=hdd", а потом использовать фильтр "?min_price=230&max_price=650" то строка запроса фильтров заменяет строку поиска, то есть результат поиска теряется и не фильтруется. Конечно, если руками вписать "?search=hdd&min_price=230&max_price=650", то получаем ожидаемый результат. Как это можно поправить, или оставить так и пусть на клиенте собирает строку запроса как угодно?
Добрый день! Да, конечно клиент должен сам собирать эти параметры в урле, так как ему хочется. Но я не понял в чем проблема собрать такую-же строку в тестах или в браузере или где-то еще..
Всем привет! Написал фильтр 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":["Введите правильную дату и время."]}
Интересно объясняешь, мне нравится, но я не пойму зачем останавливать сервер, чтобы зайти в shell? Можно же создать ещё одну вкладку консоли) и git bash была б лучше вместо обычной в пай чарме)
Да, что-то не думал об этом . Я обычно инструментами пользуюсь только встроенными в PyCharm PE, но так как здесь вынужден использовать бесплатную версию , то работаю немного непривычно для себя , по этому получается иногда не оптимально..
Я сделал проверку сортировки по полю 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']))
response = self.client.get(url, data={'ordering': 'price'}) Подскажи пожалуйста - мы ставили в браузерной строке - перед прайсом, чтобы отсортировалось по убыванию. А как сделать это в тестах? ставлю 'ordering': '-price' и 'ordering': -'price' выдаёт ошибку
просто одновременно с этим нужно поменять порядок ожидаемых значений в serializer_data на противоположный, т.к. результат будет так же перевернут "по убыванию"
Всем привет! Как отфильтровать данные??? использую 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')
На 11:50 мы сделали вывод в админке id и названия для Book, но получилось не совсем красиво - просто строка с id и name. А как сделать, чтобы вывод был в виде таблицы из трех колонок: id, name и price? Или это где-то дальше будет?
Ещё можно фильтровать (по категориям там и т.д.) list_filter=('category') только сначала нужно создать модель категории=)) и классная штука в админке save_on_top=True
Вопрос? Делаю поиск с помощью кириллицы. И регистронезависимость не работает! ( По умолчанию стоит регистронезависимый поиск! Но он тока работает для латиницы. То есть он различает букву "п" и букву "П" а хотелось бы что бы не различал. Подскажите как сделать?
@@SeniorPomidorDeveloper ага чот перерыл все не могу найти. Ну это из-за того что в url буквы преобразуются типа в такие %D0%9F . Ок ну спасибо) если появится ответ - пиши. А я буду дальше гуглить!
Что считается правильным - сортировать и фильтровать на стороне сервера (силами Джанго), или во фронтенде (JS, vue.js)? Объём БД не очень большой, 5 тысяч объектов. Такое ощущение что на стороне клиента будет быстрее, не нужно обращаться к БД.
Когда сделал изменения в 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 ? Спасибо.
Не могу ответить на вопрос , может и получится с этой базой , тут от базы зависит, надо пробовать. Гугл тут не поможет , в любом случае это какие-то хаки и «танцы с бубном» придётся исполнять. По фласку курс не планирую делать , там и функционала то мало у него.
что использовать для работы с координатами ? есть тестовое задание и я его завалил, но для меня вопрос остается открытым. нужно было создать компонент, который бы позволил получал адрес доставки и возвращал данные зоны доставки и курьера, который привязан к этой зоне. Сложность заключалась в том, что я вообще понятия не имею как организовать сохранения координат самой зоны доставки так, чтобы при получении адреса доставки происходила проверка на принадлежность данной точки (адреса доставки) к зоне доставки. Зона должна сохраняться в виде набора координат
но ведь есть же принцип, что нужно тестировать только свой код, зачем же писать тесты на фильтры, поиск и сортировку DRF? мы все равно под капот этих классов не залазим
Вообще не обязательно, но это неплохо, проверить через тест наличие фильтра в нашем viewset. Хотя-бы чтобы научится тесты писать. Когда будем делать кастумные фильтры чтобы уже был нормальный инструмент для тестирования и его понимание.
Хм. Да , вполне хороший вариант. Вообще с тестами обычно не сильно заморачиваться и тупо копируют сами данные в тест, уже отсериализованные. Тесты не обязаны быть каким-то емкими или гибкими , в отличие от кода
В новых версиях после фитрации называется filterset_fields = ['price']
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
filterset_fields = ['price']
спасибо
А ще треба реєструвати -
INSTALLED_APPS = [
...
'django_filters',
...
]
Дякую
Спасибо за замечание, долго ломал голову почему, оказывается и документацию на старую версию читал...
Тоже попался и полдня убил) спасибо))
На нынешних версиях для работы фильтра во view нужно написать filterset_fields = ['price']. В уроке на более ранних версиях было filter_fields = ['price']. В drf docs это написано, но вдруг кому пригодится
Да, это проблема что библиотеки меняются, а видео уже не поправишь
Спасибо, человек!!!
20 минут искал ошибку, почему не работала фильтрация!
@@SeniorPomidorDeveloper Огромное спасибо за отличное видео! то, что из версии к версии что-то меняется - это нормально. Этот курс по беку просто бесценен.
целую, котик
Крутейшие уроки! Лучшее объяснение по джанго в русском сегменте ютуба.
Спасибо большое, автор !
Мужик, ты крут и очень хорошо объясняешь. Не забрасывай канал !
Давно не было таких эмоций от изучения чего-то нового, как после этой лекции. После настройки поиска, когда выдало книгу Хемингуэя и книгу про него, испытал эстетическое удовольствие. Спасибо за проделанную работу, продолжайте в том же духе.
Вам спасибо что смотрите!
Спасибо! Ваше объяснение + чтение доков = понимание и работающий код.
Спасибо за интересные уроки! Очень актуально и познавательно, особенно про тестирование! Хотелось бы побольше таких видео с новыми проектами!
Спасибо, синьор помидор! ))) Ты лучший!!!
Спасибо Варламов, не знал что ты программист.
Спасибо, уже весь ваш канал пересмотрел, это последний плейлист (
скоро будет
Спасибо автору, компетентный специалист. А объяснение просто на высоте!
Спасибо за уроки, хорошо объясняешь. Очень много новой инфы и это круто! Но нужно больше опыта, сложно запоиинать все и сразу)))
Учил пайтон, SQL и прочие штуки, за Джанго боялся браться и буксовал в учебе. Как же я был не прав когда откладывал твои ролики "на потом":(
Ты лучший!
Понял что Джанго это не так страшно. Более того, с джанго хочется возиться, это прекрасно)
Спасибо большое!
Спасибо, что нашли время! Очень приятно Вас слушать
Как же вы мне помогли, вы просто не представляете, огромное Вам спасибо!! продолжайте в том же духе
Спасибо. Всё так просто выходит, ух.
👍
Спасибо! Очень крутой урок!
Спасибо, лучший канал!
Пишу комментарий чтобы по быстрей вышли новые ролики))
Ребята, если у кого будут мучения с фильтрами, как у меня. Совет: устанавливайте ту же версию django-filter, что и в видео (2.3.0), а не 22.1(которая на сегодня последняя). А также, как и автор, установите формат вывода JSON (почему-то не работает при подключенной статике drf).
Можно использовать и последнюю версию, просто необходимо добавить в приложения 'django_filters', а поле для указания полей фильтрации называется 'filterset_fields', а не 'filter_fields'. Все это есть в документации по ссылке из видео - Django REST Framework - Filtering
@@eugenebybin6403 Прочитал твой комментарий уже после всех вышеперечисленных манипуляций:)) как говорится все на своем опыте. Вначале думал, что мой пакет Django-filters встал криво...
Спасибо.
Спасибо!
лайкнул, подписался и всё такое :D
отлично. ещё раз спасибо.
Это просто пушка. Спасибо
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"}
]
Да, выглядит правильно .
@@SeniorPomidorDeveloper спасибо за обратную связь. Материал, который вы выдаёте просто пушка! Спасибо вам!
Вам спасибо!
@@nikitaradionov4393 твой вариант немного неправильный. Да, ты получишь верный результат, однако такой подход неоптимизированный. У тебя вместо одного запроса будет целая серия из-за того, что ты используешь дополнительную сериализацию.В таком случае нужно обьединять таблицы и назначать ОДИН сериализатор
Великолепно. Спасибо огромное
а чем отличается способ admin.site.register(Book) от @admin.register(Book)
... class BookAdmin(ModelAdmin)? спасибо.
Не знаю... скорее всего ничем. Точнее втрой вариант позволяет как-то настраивать и расширять эту модель в админка. Первый вроде такого не может .
Очень спасибо!
а сколько лет вы уже изучаете django? курс просто вау, все понятно, не думал что есть такие люди в ру сегменте 🤩
Лет восемь я на Джанго работаю.
Спасибо за такой отзыв!
если есть конечно время для ответа, то помоги, пожалуйста, а за видео спасибо.
Поняла, что не особо задумывалась над разницей между filter and search, особенно с применении к конкретным данным.
Предположим с моей модели есть поле категория с ForeignKey (Category). Тогда, учитывая особенности Фильтрации, наверное можно во viewset-e прописать просто filter_fields = ['category'] , а не ['category_name'],т.к. фронтенд может мне переслать id категории, которую выбрал юзер.
Да, все верно. Фильтр это по одному полю , а поиск по нескольким разным
я еще обратил внимание, что Сеньор вроде как не добавлял в INSTALLED_APPS строку с 'django-filters', как написано в доке, но при этом у него работало)
Ой
@@SeniorPomidorDeveloper А можешь сказать почему все равно работает?)
Добрый вечер а можете показать как сделать профиль пользователя с формой обратной связи чтобы форма отравляла заявку на почту пользователя который зарегистрированный на сайте
Очень классные уроки. Всё понятно, но есть незакрытые моменты. Вот как искать допустим по полю цены от 500 до 700 ? Ну это же постоянно встречается в фильтрах и такой популярный кейс совершенно не рассмотрен.
Это вам домашнее задание
Вопрос такой, если у меня в моделях есть поле с датой, то можна ли как-то скпинуть это поле, бо каждый раз менять дату в тестах не удобно?
Да, проще всего будет ее заморозить , библиотекой freezegun , через декоратор @freeze_time("2012-01-14")
Ну или через mock, написать mock.ANY вместо даты , где мы проверяем данные
Присоэдиняюсь к восторженым зрителям. Урок очень класный. Уменя эсть вопрос , не буду долго росказывать что я только росбираюсь в джанго , может мой вопрос будет и очень простой. На 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. Я стараюсь объяснять подробно, насколько, насколько это возможно в рамках этого видео, сохраняя темп курса. Если рассказывать про устройство каждого класса то урок длился бы два часа , не думаю что это кому-то понравится , там мы написали всего две строчки .
@@SeniorPomidorDeveloper Спасибо за ответ. Буду вникать
Класс, спасибо!
Здравствуйте, подскажите пожалуйста, написал тест для сортировки, а он помимо выдуманных данных, которые мы прописывали в setUp, берет и данные из базы данных. Проверил остальные тесты, они тоже берут значения из базы данных. Не понимаю как такое возможно, ведь ниже вы писали: "В тесте проверяется то, что там создается . Так это работает, так задумано"
Здравствуйте! Это может быть если в настройках в адресе тестовой базы вы написали адрес основной. Или наоборот. По умолчанию такого не должно быть. А тестовая база должна называться как основная + «_test». Как вариант, если что-то перепуталось то можно придумать какой новое название тестовой базы и прописать в конфигурации
@@SeniorPomidorDeveloper , подскажите пожалуйста, где изменить настройки адреса тестовой базы данных. Пересмотрел последние 3 видео и не нашел где вы настраиваете тестовую базу данных, а дело в том, что я делал все как вы. Единственное отличие: у меня windows и соответственно я дописал
import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.settings")
django.setup()
Да это надо загуглить или у чат гпт лучше спросить. Не помню точно название переменной , где-то внутри DATABASE
@@SeniorPomidorDeveloper, хорошо, спасибо огромное, буду пробовать!!!
@@SeniorPomidorDeveloper, в общем и целом, я смог решить данную проблему и оставлю решение здесь, вдруг у кого-то возникнет такая же проблема.
Вы были правы, по умолчанию тестовая база данных создается сама, и я даже проверил в PgAdmin, она у меня даже создавалась, но не использовалась.
Я пробовал добавлять поле 'TEST'{'NAME': 'test_book_db', но это не помогло, помогло только создание нового файла 'test_settings.py' в котором прописал:
from .settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'test_books_db',
'USER': 'books_user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
а потом добавил ссылку на этот файл в файле test_api.py:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "books.test_settings")
Спасибо вам!!!
Добрый день. Можно задать вопрос? Почем при использовании filters.SearchFilter и DjangoFilterBackend строки запросе не конкатенируются, а заменяют друг друга. Если использовать поиск то "?search=hdd", а потом использовать фильтр "?min_price=230&max_price=650" то строка запроса фильтров заменяет строку поиска, то есть результат поиска теряется и не фильтруется. Конечно, если руками вписать "?search=hdd&min_price=230&max_price=650", то получаем ожидаемый результат. Как это можно поправить, или оставить так и пусть на клиенте собирает строку запроса как угодно?
Добрый день! Да, конечно клиент должен сам собирать эти параметры в урле, так как ему хочется. Но я не понял в чем проблема собрать такую-же строку в тестах или в браузере или где-то еще..
@@SeniorPomidorDeveloper да нет. Проблемы нет. Мне показалось подобное поведение ошибкой, вот и спросил. Спасибо большое за ответ.
Привет, спасибо за крутые уроки, но может быть есть ссылка на гитхаб с кодом?
Вам спасибо! github.com/chepe4pi/books_lessons
Всем привет!
Написал фильтр
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":["Введите правильную дату и время."]}
Похоже что формат даты должен быть другой , возможно со временем тоже, так как это DateTime
Например сортировка по имени автора.( book 1 = author 1, book 2 =author 5, book 3 = author 2)
def test_get_ordering(self):
url = reverse('book-list')
response = self.client.get(url, data={'ordering': 'author_name'})
serializer_data = BooksSerializer([self.book_1, self.book_3,
self.book_2], many=True).data
self.assertEqual(status.HTTP_200_OK, response.status_code)
self.assertEqual(serializer_data, response.data)
Супер !
@@SeniorPomidorDeveloper А скажите пожалуйста, вы работаете на должности senior python bakckend developer?)
Да. )
@@SeniorPomidorDeveloper а сколько лет в разработке?
Работаю программистом лет уже 5, начал программировать лет 10 назад.
Интересно объясняешь, мне нравится, но я не пойму зачем останавливать сервер, чтобы зайти в shell? Можно же создать ещё одну вкладку консоли) и git bash была б лучше вместо обычной в пай чарме)
Да, что-то не думал об этом . Я обычно инструментами пользуюсь только встроенными в PyCharm PE, но так как здесь вынужден использовать бесплатную версию , то работаю немного непривычно для себя , по этому получается иногда не оптимально..
👍
26:50 мешает голова, напишите пожалуйста запрос
Это путь до файла. Потом имя класса, потом имя функции. Все пишется через точку.
Я сделал проверку сортировки по полю 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']))
response = self.client.get(url, data={'ordering': 'price'})
Подскажи пожалуйста - мы ставили в браузерной строке - перед прайсом, чтобы отсортировалось по убыванию. А как сделать это в тестах? ставлю 'ordering': '-price' и 'ordering': -'price' выдаёт ошибку
Знак минус конечно должен быть внутри кавычек. По ошибке не знаю что подсказать, смотря какая там ошибка , они очень разные бывают
просто одновременно с этим нужно поменять порядок ожидаемых значений в serializer_data на противоположный, т.к. результат будет так же перевернут "по убыванию"
Для чего нужны поиск и сортировка в ресте?
Чтобы искать и сортировать) На сайте , к примеру. Рест это то, что стоит за визуальной оболочкой сайта.
@@SeniorPomidorDeveloper Спсибо бро, так и подумал)
😁
Всем привет!
Как отфильтровать данные???
использую 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')
@@SeniorPomidorDeveloper Спасибо!
На 11:50 мы сделали вывод в админке id и названия для Book, но получилось не совсем красиво - просто строка с id и name. А как сделать, чтобы вывод был в виде таблицы из трех колонок: id, name и price? Или это где-то дальше будет?
Не очень понял что на 11:50. Вообще это курс чисто про API, про отображение тут ничего не будет, мы это все оставляем воображаемому фронтендеру .
Ещё можно фильтровать (по категориям там и т.д.) list_filter=('category') только сначала нужно создать модель категории=)) и классная штука в админке save_on_top=True
В классе BookAdmin():
list_display=('id', 'name', 'price')
list_display_links=('id', 'name')
Вопрос? Делаю поиск с помощью кириллицы. И регистронезависимость не работает! ( По умолчанию стоит регистронезависимый поиск! Но он тока работает для латиницы. То есть он различает букву "п" и букву "П" а хотелось бы что бы не различал. Подскажите как сделать?
Честно говоря , не знаю , надо гуглить типа «case insensitive search utf-8”
@@SeniorPomidorDeveloper ага чот перерыл все не могу найти. Ну это из-за того что в url буквы преобразуются типа в такие %D0%9F . Ок ну спасибо) если появится ответ - пиши. А я буду дальше гуглить!
@@СергейХохлов-ю4д вы нашли ответ?
Что считается правильным - сортировать и фильтровать на стороне сервера (силами Джанго), или во фронтенде (JS, vue.js)? Объём БД не очень большой, 5 тысяч объектов. Такое ощущение что на стороне клиента будет быстрее, не нужно обращаться к БД.
Только на сервере . База данных всегда имеет свойство расти . И не нужно будет нагружать сеть лишними данными
вопрос немного не по теме видео, но при изменении css файла django не отображает эти изменения на сайте, что делать?
Пересобрать через команду collectstatic? Не очень знаю, на самом деле
попробуйте в браузере работать инкогнито, у него кэш очищается.
Когда сделал изменения в CSS и идешь в браузер смотреть результат, то для обновления страницы используй Ctrl + F5. Это Hard Refresh. Чистит кеш страницы.
А почему мы не проверяем книги из БД, а лишь созданные внутри теста?
В тесте проверяется то, что там создается . Так это работает, так задумано
@@SeniorPomidorDeveloper Спасибо что отвечаешь)
@@nicholasspezza9449 А вот грубить мне не стоило бы, если только вам нарвится выглядить идиотом.
Это всё хорошо и познавательно. Но как быть в случае если надо разработать 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 ? Спасибо.
Не могу ответить на вопрос , может и получится с этой базой , тут от базы зависит, надо пробовать. Гугл тут не поможет , в любом случае это какие-то хаки и «танцы с бубном» придётся исполнять. По фласку курс не планирую делать , там и функционала то мало у него.
как отфильтровать по месяцу и году игнорируя день?
Типа двойной фильтр . gte=01-08-2021 , lt=01-09-2021
@@SeniorPomidorDeveloper у вьюшки api прописано поле для фильтра дата. Как указать в параметрах урла фильтр по году и месяцу? это в связки DRF
Думаю что так не получится
что использовать для работы с координатами ?
есть тестовое задание и я его завалил, но для меня вопрос остается открытым.
нужно было создать компонент, который бы позволил получал адрес доставки и возвращал данные зоны доставки и курьера, который привязан к этой зоне. Сложность заключалась в том, что я вообще понятия не имею как организовать сохранения координат самой зоны доставки так, чтобы при получении адреса доставки происходила проверка на принадлежность данной точки (адреса доставки) к зоне доставки. Зона должна сохраняться в виде набора координат
Сложное задание. Тут нужно скорее всего использовать PostGIS и искать примеры как на нем такие штуки делаются..
@@SeniorPomidorDeveloper спасибо тебе!)
у вас есть телеграм беседа?
Есть группа , ссылка в шапке профиля
исходники?
Да были где-то...
Вроде это github.com/chepe4pi/books_lessons
Ветки по дням
но ведь есть же принцип, что нужно тестировать только свой код, зачем же писать тесты на фильтры, поиск и сортировку DRF? мы все равно под капот этих классов не залазим
Вообще не обязательно, но это неплохо, проверить через тест наличие фильтра в нашем viewset. Хотя-бы чтобы научится тесты писать. Когда будем делать кастумные фильтры чтобы уже был нормальный инструмент для тестирования и его понимание.
сражался с тестами для сортировки, в итоге вышло так:
def test_ordering(self):
"""Проверка сортировки"""
url = reverse('book-list')
response = self.client.get(url, data={'ordering': '-title'})
serializer_data = BookSerializer([self.book3, self.book2, self.book1], many=True)
serializer_data_sort = sorted(serializer_data.to_representation(serializer_data.data), key=itemgetter('title'))
self.assertEqual(serializer_data_sort, response.data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
Хм. Да , вполне хороший вариант.
Вообще с тестами обычно не сильно заморачиваться и тупо копируют сами данные в тест, уже отсериализованные. Тесты не обязаны быть каким-то емкими или гибкими , в отличие от кода
спасибо!👍
Супер, спасибо!