From 4c7b18d07bef13f4afc68775a62b44e181e10fd1 Mon Sep 17 00:00:00 2001 From: Eden Kirin Date: Tue, 14 May 2024 22:34:21 +0200 Subject: [PATCH] Filter list with db model --- .gitignore | 1 - db.sqlite3 | Bin 0 -> 131072 bytes project/main/apps.py | 2 +- project/main/migrations/0001_initial.py | 34 +++ .../0002_example_data.py} | 225 ++++++++++-------- project/main/models.py | 3 - project/main/models/__init__.py | 1 + project/main/models/cat_breed.py | 12 + project/main/views/filter_list.py | 28 ++- project/settings.py | 1 + 10 files changed, 193 insertions(+), 114 deletions(-) create mode 100644 db.sqlite3 create mode 100644 project/main/migrations/0001_initial.py rename project/main/{cat_breeds.py => migrations/0002_example_data.py} (88%) delete mode 100644 project/main/models.py create mode 100644 project/main/models/__init__.py create mode 100644 project/main/models/cat_breed.py diff --git a/.gitignore b/.gitignore index e3fb58e..06e58eb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ /.vscode /.venv __pycache__ -/db.sqlite3 /project/settings_local.py diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..b99bb960febf2effd07308ff5e60cf3251648ebb GIT binary patch literal 131072 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 list[str]: - return sorted(set([c.country for c in cat_breeds if len(c.country)])) + ann = ( + CatBreed.objects.values("country") + .annotate(Count("country")) + .order_by("country") + ) + return [a["country"] for a in ann] def filter_cat_breeds( breed_filter: Optional[str] = None, country_filter: Optional[str] = None ) -> list[CatBreed]: - if not breed_filter and not country_filter: - return cat_breeds + q = Q() - result = [] - for breed in cat_breeds: - # if (not breed_filter or breed_filter.lower() in breed.name.lower()) or ( - # not country_filter or country_filter == breed.country - # ): - if not breed_filter or breed_filter.lower() in breed.name.lower(): - result.append(breed) - return result + if breed_filter: + q &= Q(name__icontains=breed_filter) + if country_filter: + q &= Q(country=country_filter) + + return CatBreed.objects.filter(q).order_by("name") class FilterListView(DemoViewBase): diff --git a/project/settings.py b/project/settings.py index c398419..efe6b9e 100644 --- a/project/settings.py +++ b/project/settings.py @@ -37,6 +37,7 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "project.main", ] MIDDLEWARE = [