Duyen Hoang

Duyen Hoang

1660532580

Cách Thêm Tìm Kiếm Cơ Bản Và Toàn Văn Vào Ứng Dụng Django Với Postgres

Không giống như cơ sở dữ liệu quan hệ, tìm kiếm toàn văn không được chuẩn hóa. Có một số tùy chọn nguồn mở như ElasticSearch, Solr và Xapian. ElasticSearch có lẽ là giải pháp phổ biến nhất; tuy nhiên, nó phức tạp để thiết lập và duy trì. Hơn nữa, nếu bạn không tận dụng được một số tính năng nâng cao mà ElasticSearch cung cấp, bạn nên gắn bó với khả năng tìm kiếm toàn văn bản mà nhiều cơ sở dữ liệu quan hệ (như Postgres, MySQL, SQLite) và không quan hệ (như MongoDB và CouchDB ) lời đề nghị. Đặc biệt, Postgres rất thích hợp cho việc tìm kiếm toàn văn. Django cũng hỗ trợ nó ngay lập tức.

Đối với phần lớn các ứng dụng Django của bạn, ít nhất bạn nên bắt đầu với việc tận dụng tìm kiếm toàn văn từ Postgres trước khi tìm đến một giải pháp mạnh mẽ hơn như ElasticSearch hoặc Solr.

Trong hướng dẫn này, bạn sẽ học cách thêm tìm kiếm toàn văn và cơ bản vào ứng dụng Django bằng Postgres. Bạn cũng sẽ tối ưu hóa tìm kiếm toàn văn bằng cách thêm trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu.

Mục tiêu

Đến cuối hướng dẫn này, bạn sẽ có thể:

  1. Thiết lập chức năng tìm kiếm cơ bản trong ứng dụng Django với mô-đun đối tượng Q
  2. Thêm tìm kiếm toàn văn bản vào ứng dụng Django
  3. Sắp xếp các kết quả tìm kiếm toàn văn bản theo mức độ liên quan bằng cách sử dụng các kỹ thuật tạo gốc, xếp hạng và trọng số
  4. Thêm bản xem trước vào kết quả tìm kiếm của bạn
  5. Tối ưu hóa tìm kiếm toàn văn bản với trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu

Tổng quan và thiết lập dự án

Sao chép nhánh cơ sở từ repo django-search :

$ git clone https://github.com/testdrivenio/django-search --branch base --single-branch
$ cd django-search

Bạn sẽ sử dụng Docker để đơn giản hóa việc thiết lập và chạy Postgres cùng với Django.

Từ thư mục gốc của dự án, hãy tạo các hình ảnh và xoay các vùng chứa Docker:

$ docker-compose up -d --build

Tiếp theo, áp dụng các di chuyển và tạo một siêu người dùng:

$ docker-compose exec web python manage.py makemigrations
$ docker-compose exec web python manage.py migrate
$ docker-compose exec web python manage.py createsuperuser

Sau khi hoàn tất, hãy điều hướng đến http://127.0.0.1:8011/quotes/ để đảm bảo ứng dụng hoạt động như mong đợi. Bạn sẽ thấy những điều sau:

Trích dẫn Trang chủ

Bạn muốn tìm hiểu cách làm việc với Django và Postgres? Xem bài viết Dockerizing Django với Postgres, Gunicorn và Nginx .

Lưu ý về Quotemô hình trong dấu ngoặc kép / models.py :

from django.db import models

class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)

    def __str__(self):
        return self.quote

Tiếp theo, chạy lệnh quản lý sau để thêm 10.000 dấu ngoặc kép vào cơ sở dữ liệu:

$ docker-compose exec web python manage.py add_quotes

Quá trình này sẽ mất vài phút. Sau khi hoàn tất, hãy điều hướng đến http://127.0.0.1:8011/quotes/ để xem dữ liệu.

Đầu ra của dạng xem được lưu trong bộ nhớ cache trong năm phút, vì vậy bạn có thể muốn nhận xét @method_decoratortrong ngoặc kép / views.py để tải các trích dẫn. Đảm bảo xóa nhận xét sau khi hoàn tất.

Trích dẫn Trang chủ

Trong tệp dấu ngoặc kép / mẫu / quote.html , bạn có một biểu mẫu cơ bản với trường nhập tìm kiếm:

<form action="{% url 'search_results' %}" method="get">
  <input
    type="search"
    name="q"
    placeholder="Search by name or quote..."
    class="form-control"
  />
</form>

Khi gửi, biểu mẫu sẽ gửi dữ liệu đến phần phụ trợ. Yêu GETcầu được sử dụng thay vì sử dụng POSTtheo cách đó, chúng tôi có quyền truy cập vào chuỗi truy vấn cả trong URL và trong chế độ xem Django, cho phép người dùng chia sẻ kết quả tìm kiếm dưới dạng liên kết.

Trước khi tiếp tục, hãy xem nhanh cấu trúc dự án và phần còn lại của mã.

Tìm kiếm cơ bản

Khi nói đến tìm kiếm, với Django, thông thường bạn sẽ bắt đầu bằng cách thực hiện các truy vấn tìm kiếm với containshoặc icontainsđối với các kết quả phù hợp chính xác. Đối tượng Q cũng có thể được sử dụng để thêm toán tử logic AND ( &) hoặc OR ( ).|

Ví dụ: bằng cách sử dụng toán tử OR, ghi đè SearchResultsListmặc định của ' QuerySettrong dấu ngoặc kép / views.py như sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(
            Q(name__icontains=query) | Q(quote__icontains=query)
        )

Ở đây, chúng tôi đã sử dụng phương pháp bộ lọc để lọc theo namehoặc quotecác trường. Hơn nữa, chúng tôi cũng sử dụng tiện ích mở rộng icontains để kiểm tra xem truy vấn có xuất hiện trong các trường namehoặc quote(phân biệt chữ hoa chữ thường) hay không. Kết quả dương tính sẽ được trả về nếu tìm thấy kết quả trùng khớp.

Đừng quên nhập:

from django.db.models import Q

Hãy dùng thử:

Trang tìm kiếm

For small data sets, this is a great way to add basic search functionality to your app. If you're dealing with a large data set or want search functionality that feels like an Internet search engine, you'll want to move to full-text search.

Full-text Search

The basic search that we saw earlier has several limitations especially when you want to perform complex lookups.

As mentioned, with basic search, you can only perform exact matches.

Một hạn chế khác là stop words . Các từ dừng là những từ như "a", "an" và "the". Những từ này là phổ biến và không đủ ý nghĩa, do đó chúng nên được bỏ qua. Để kiểm tra, hãy thử tìm kiếm một từ có "the" ở phía trước. Giả sử bạn đã tìm kiếm "ở giữa". Trong trường hợp này, bạn sẽ chỉ thấy kết quả cho "giữa", vì vậy bạn sẽ không thấy bất kỳ kết quả nào có từ "giữa" mà không có "cái" trước nó.

Giả sử bạn có hai câu sau:

  1. Tôi ở giữa.
  2. Bạn không thích trường cấp hai.

Bạn sẽ nhận được những thông tin sau được trả về với mỗi loại tìm kiếm:

Truy vấnTìm kiếm cơ bảnTìm kiếm toàn văn
"giữa"11 và 2
"ở giữa"1 và 21 và 2

Một vấn đề khác là bỏ qua những từ tương tự. Với tìm kiếm cơ bản, chỉ các kết quả phù hợp chính xác mới được trả về. Tuy nhiên, với tìm kiếm toàn văn, các từ tương tự được tính đến. Để kiểm tra, hãy cố gắng tìm một số từ tương tự như "pony" và "ponies". Với tìm kiếm cơ bản, nếu bạn tìm kiếm "ngựa con", bạn sẽ không thấy kết quả có chứa "ngựa con" - và ngược lại.

Giả sử bạn có hai câu này.

  1. Tôi là một con ngựa.
  2. Bạn không thích ngựa con

Bạn sẽ nhận được những thông tin sau được trả về với mỗi loại tìm kiếm:

Truy vấnTìm kiếm cơ bảnTìm kiếm toàn văn
"ngựa con"11 và 2
"ngựa con"21 và 2

Với tìm kiếm toàn văn, cả hai vấn đề này đều được giảm thiểu. Tuy nhiên, hãy nhớ rằng tùy thuộc vào mục tiêu của bạn, tìm kiếm toàn văn có thể thực sự làm giảm độ chính xác (chất lượng) và khả năng thu hồi (số lượng kết quả có liên quan). Thông thường, tìm kiếm toàn văn ít chính xác hơn tìm kiếm cơ bản, vì tìm kiếm cơ bản mang lại kết quả khớp chính xác. Điều đó nói rằng, nếu bạn đang tìm kiếm thông qua các tập dữ liệu lớn với các khối văn bản lớn, thì tìm kiếm toàn văn được ưu tiên hơn vì nó thường nhanh hơn nhiều.

Tìm kiếm toàn văn bản là một kỹ thuật tìm kiếm nâng cao kiểm tra tất cả các từ trong mọi tài liệu được lưu trữ khi nó cố gắng khớp với các tiêu chí tìm kiếm. Ngoài ra, với tìm kiếm toàn văn, bạn có thể sử dụng nguồn gốc ngôn ngữ cụ thể trên các từ được lập chỉ mục. Ví dụ: từ "drive", "drive" và "drive" sẽ được ghi trong khái niệm duy nhất từ ​​"drive". Rút gọn là quá trình rút gọn các từ thành dạng gốc, cơ sở hoặc gốc từ của chúng.

Đủ để nói rằng tìm kiếm toàn văn không phải là hoàn hảo. Nó có khả năng truy xuất nhiều tài liệu không liên quan (dương tính giả) với truy vấn tìm kiếm dự định. Tuy nhiên, có một số kỹ thuật dựa trên thuật toán Bayes có thể giúp giảm thiểu các vấn đề như vậy.

Để tận dụng tính năng tìm kiếm toàn văn của Postgres với Django, hãy thêm django.contrib.postgresvào INSTALLED_APPSdanh sách của bạn:

INSTALLED_APPS = [
    ...

    "django.contrib.postgres",  # new
]

Tiếp theo, chúng ta hãy xem xét hai ví dụ nhanh về tìm kiếm toàn văn, trên một trường duy nhất và trên nhiều trường.

Tìm kiếm trường đơn

Cập nhật get_querysetchức năng dưới chức SearchResultsListnăng xem như sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(quote__search=query)

Ở đây, chúng tôi thiết lập tìm kiếm toàn văn dựa trên một trường duy nhất - trường trích dẫn.

Trang tìm kiếm

Như bạn có thể thấy, cần tính đến những từ tương tự. Trong ví dụ trên, "ngựa con" và "ngựa con" được coi là những từ tương tự.

Tìm kiếm nhiều trường

Để tìm kiếm đối với nhiều trường và trên các mô hình liên quan, bạn có thể sử dụng SearchVectorlớp.

Một lần nữa, hãy cập nhật SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.annotate(search=SearchVector("name", "quote")).filter(
            search=query
        )

To search against multiple fields, you annotated the queryset using a SearchVector. The vector is the data that you're searching for, which has been converted into a form that is easy to search. In the example above, this data is the name and quote fields in your database.

Make sure to add the import:

from django.contrib.postgres.search import SearchVector

Try some searches out.

Stemming and Ranking

In this section, you'll combine several methods such as SearchVector, SearchQuery, and SearchRank to produce a very robust search that uses both stemming and ranking.

Again, stemming is the process of reducing words to their word stem, base, or root form. With stemming, words like "child" and "children" will be treated as similar words. Ranking, on the other hand, allows us to order results by relevancy.

Update SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", "quote")
        search_query = SearchQuery(query)
        return (
            Quote.objects.annotate(
                search=search_vector, rank=SearchRank(search_vector, search_query)
            )
            .filter(search=search_query)
            .order_by("-rank")
        )

What's happening here?

  1. SearchVector - again you used a search vector to search against multiple fields. The data is converted into another form since you're no longer just searching the raw text like you did when icontains was used. Therefore, with this, you will be able to search plurals easily. For example, searching for "flask" and "flasks" will yield the same search because they are, well, basically the same thing.
  2. SearchQuery- dịch các từ được cung cấp cho chúng tôi dưới dạng truy vấn từ biểu mẫu, chuyển chúng qua một thuật toán bắt nguồn và sau đó nó tìm kiếm các kết quả phù hợp cho tất cả các cụm từ kết quả.
  3. SearchRank- cho phép chúng tôi sắp xếp các kết quả theo mức độ liên quan. Nó tính đến tần suất các thuật ngữ truy vấn xuất hiện trong tài liệu, mức độ gần gũi của các thuật ngữ trên tài liệu và phần quan trọng của tài liệu là nơi chúng xuất hiện.

Thêm nhập khẩu:

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank

Trang tìm kiếm

So sánh kết quả từ tìm kiếm cơ bản với tìm kiếm toàn văn. Có một sự khác biệt rõ ràng. Trong tìm kiếm toàn văn, truy vấn có kết quả cao nhất được hiển thị đầu tiên. Đây là sức mạnh của SearchRank. Kết hợp SearchVectorSearchQuerySearchRankmột cách nhanh chóng để tạo ra một tìm kiếm chính xác và mạnh mẽ hơn nhiều so với tìm kiếm cơ bản.

Thêm trọng lượng

Tìm kiếm toàn văn cung cấp cho chúng tôi khả năng thêm tầm quan trọng cho một số trường trong bảng của chúng tôi trong cơ sở dữ liệu so với các trường khác. Chúng ta có thể đạt được điều này bằng cách thêm trọng số vào các truy vấn của mình.

Trọng lượng phải là một trong các chữ cái sau D, C, B, A. Theo mặc định, các trọng số này lần lượt là các số 0,1, 0,2, 0,4 và 1,0.

Cập nhật SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", weight="B") + SearchVector(
            "quote", weight="A"
        )
        search_query = SearchQuery(query)
        return (
            Quote.objects.annotate(rank=SearchRank(search_vector, search_query))
            .filter(rank__gte=0.3)
            .order_by("-rank")
        )

Ở đây, bạn đã thêm trọng số vào việc SearchVectorsử dụng cả trường namequote. Trọng số 0,4 và 1,0 lần lượt được áp dụng cho các trường tên và trích dẫn. Do đó, các trận đấu trích dẫn sẽ chiếm ưu thế hơn các trận đấu nội dung tên. Cuối cùng, bạn lọc kết quả để chỉ hiển thị những kết quả lớn hơn 0,3.

Thêm bản xem trước vào kết quả tìm kiếm

Trong phần này, bạn sẽ thêm một bản xem trước kết quả tìm kiếm của mình thông qua phương pháp SearchHeadline . Điều này sẽ làm nổi bật truy vấn kết quả tìm kiếm.

Cập nhật SearchResultsListlại:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", "quote")
        search_query = SearchQuery(query)
        search_headline = SearchHeadline("quote", search_query)
        return Quote.objects.annotate(
            search=search_vector,
            rank=SearchRank(search_vector, search_query)
        ).annotate(headline=search_headline).filter(search=search_query).order_by("-rank")

Các SearchHeadlinediễn biến trong lĩnh vực bạn muốn xem trước. Trong trường hợp này, đây sẽ là quotetrường cùng với truy vấn, sẽ được in đậm.

Đảm bảo thêm nhập:

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank, SearchHeadline

Trước khi thử một số tìm kiếm, hãy cập nhật <li></li>trong dấu ngoặc kép / template / search.html như sau:

<li>{{ quote.headline | safe }} - <b>By <i>{{ quote.name }}</i></b></li>

Bây giờ, thay vì hiển thị các trích dẫn như bạn đã làm trước đây, chỉ một bản xem trước của trường trích dẫn đầy đủ được hiển thị cùng với truy vấn tìm kiếm được đánh dấu.

Tăng hiệu suất

Tìm kiếm toàn văn là một quá trình chuyên sâu. Để chống lại hiệu suất chậm, bạn có thể:

  1. Lưu các vectơ tìm kiếm vào cơ sở dữ liệu với SearchVectorField . Nói cách khác, thay vì chuyển đổi các chuỗi thành các vectơ tìm kiếm một cách nhanh chóng, chúng tôi sẽ tạo một trường cơ sở dữ liệu riêng có chứa các vectơ tìm kiếm đã xử lý và cập nhật trường bất cứ khi nào có chèn hoặc cập nhật cho hoặc các quotetrường name.
  2. Tạo chỉ mục cơ sở dữ liệu , là một cấu trúc dữ liệu giúp nâng cao tốc độ của quá trình truy xuất dữ liệu trên cơ sở dữ liệu. Do đó, nó tăng tốc độ truy vấn. Postgres cung cấp cho bạn một số chỉ mục để làm việc có thể áp dụng cho các trường hợp khác nhau. GinIndex được cho là phổ biến nhất.

To learn more about performance with full-text search, review the Performance section from the Django docs.

Search Vector Field

Start by adding a new SearchVectorField field to the Quote model in quotes/models.py:

from django.contrib.postgres.search import SearchVectorField  # new
from django.db import models


class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)
    search_vector = SearchVectorField(null=True)  # new

    def __str__(self):
        return self.quote

Create the migration file:

$ docker-compose exec web python manage.py makemigrations

Now, you can only populate this field when the quote or name objects already exists in the database. Thus, we need to add a trigger to update the search_vector field whenever the quote or name fields are updated. To achieve this, create a custom migration file in "quotes/migrations" called 0003_search_vector_trigger.py:

from django.contrib.postgres.search import SearchVector
from django.db import migrations


def compute_search_vector(apps, schema_editor):
    Quote = apps.get_model("quotes", "Quote")
    Quote.objects.update(search_vector=SearchVector("name", "quote"))


class Migration(migrations.Migration):

    dependencies = [
        ("quotes", "0002_quote_search_vector"),
    ]

    operations = [
        migrations.RunSQL(
            sql="""
            CREATE TRIGGER search_vector_trigger
            BEFORE INSERT OR UPDATE OF name, quote, search_vector
            ON quotes_quote
            FOR EACH ROW EXECUTE PROCEDURE
            tsvector_update_trigger(
                search_vector, 'pg_catalog.english', name, quote
            );
            UPDATE quotes_quote SET search_vector = NULL;
            """,
            reverse_sql="""
            DROP TRIGGER IF EXISTS search_vector_trigger
            ON quotes_quote;
            """,
        ),
        migrations.RunPython(
            compute_search_vector, reverse_code=migrations.RunPython.noop
        ),
    ]

Depending on your project structure, you may need to update the name of the previous migration file in dependencies.

Áp dụng các di chuyển:

$ docker-compose exec web python manage.py migrate

Để sử dụng trường mới cho các tìm kiếm, hãy cập nhật SearchResultsListnhư sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(search_vector=query)

Cập nhật lại <li></li>trong ngoặc kép / template / search.html :

<li>{{ quote.quote | safe }} - <b>By <i>{{ quote.name }}</i></b></li>

Mục lục

Cuối cùng, hãy thiết lập một chỉ số chức năng, GinIndex .

Cập nhật Quotemô hình:

from django.contrib.postgres.indexes import GinIndex  # new
from django.contrib.postgres.search import SearchVectorField
from django.db import models


class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)
    search_vector = SearchVectorField(null=True)

    def __str__(self):
        return self.quote

    # new
    class Meta:
        indexes = [
            GinIndex(fields=["search_vector"]),
        ]

Tạo và áp dụng di chuyển lần cuối:

$ docker-compose exec web python manage.py makemigrations
$ docker-compose exec web python manage.py migrate

Kiểm tra nó ra.

Sự kết luận

Trong hướng dẫn này, bạn đã được hướng dẫn cách thêm tìm kiếm toàn văn và cơ bản vào ứng dụng Django. Chúng tôi cũng đã xem xét cách tối ưu hóa chức năng tìm kiếm toàn văn bằng cách thêm trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu.

Lấy mã hoàn chỉnh từ kho tìm kiếm django .

Nguồn:  https://testdriven.io

#django #postgres 

What is GEEK

Buddha Community

Cách Thêm Tìm Kiếm Cơ Bản Và Toàn Văn Vào Ứng Dụng Django Với Postgres
Duyen Hoang

Duyen Hoang

1660532580

Cách Thêm Tìm Kiếm Cơ Bản Và Toàn Văn Vào Ứng Dụng Django Với Postgres

Không giống như cơ sở dữ liệu quan hệ, tìm kiếm toàn văn không được chuẩn hóa. Có một số tùy chọn nguồn mở như ElasticSearch, Solr và Xapian. ElasticSearch có lẽ là giải pháp phổ biến nhất; tuy nhiên, nó phức tạp để thiết lập và duy trì. Hơn nữa, nếu bạn không tận dụng được một số tính năng nâng cao mà ElasticSearch cung cấp, bạn nên gắn bó với khả năng tìm kiếm toàn văn bản mà nhiều cơ sở dữ liệu quan hệ (như Postgres, MySQL, SQLite) và không quan hệ (như MongoDB và CouchDB ) lời đề nghị. Đặc biệt, Postgres rất thích hợp cho việc tìm kiếm toàn văn. Django cũng hỗ trợ nó ngay lập tức.

Đối với phần lớn các ứng dụng Django của bạn, ít nhất bạn nên bắt đầu với việc tận dụng tìm kiếm toàn văn từ Postgres trước khi tìm đến một giải pháp mạnh mẽ hơn như ElasticSearch hoặc Solr.

Trong hướng dẫn này, bạn sẽ học cách thêm tìm kiếm toàn văn và cơ bản vào ứng dụng Django bằng Postgres. Bạn cũng sẽ tối ưu hóa tìm kiếm toàn văn bằng cách thêm trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu.

Mục tiêu

Đến cuối hướng dẫn này, bạn sẽ có thể:

  1. Thiết lập chức năng tìm kiếm cơ bản trong ứng dụng Django với mô-đun đối tượng Q
  2. Thêm tìm kiếm toàn văn bản vào ứng dụng Django
  3. Sắp xếp các kết quả tìm kiếm toàn văn bản theo mức độ liên quan bằng cách sử dụng các kỹ thuật tạo gốc, xếp hạng và trọng số
  4. Thêm bản xem trước vào kết quả tìm kiếm của bạn
  5. Tối ưu hóa tìm kiếm toàn văn bản với trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu

Tổng quan và thiết lập dự án

Sao chép nhánh cơ sở từ repo django-search :

$ git clone https://github.com/testdrivenio/django-search --branch base --single-branch
$ cd django-search

Bạn sẽ sử dụng Docker để đơn giản hóa việc thiết lập và chạy Postgres cùng với Django.

Từ thư mục gốc của dự án, hãy tạo các hình ảnh và xoay các vùng chứa Docker:

$ docker-compose up -d --build

Tiếp theo, áp dụng các di chuyển và tạo một siêu người dùng:

$ docker-compose exec web python manage.py makemigrations
$ docker-compose exec web python manage.py migrate
$ docker-compose exec web python manage.py createsuperuser

Sau khi hoàn tất, hãy điều hướng đến http://127.0.0.1:8011/quotes/ để đảm bảo ứng dụng hoạt động như mong đợi. Bạn sẽ thấy những điều sau:

Trích dẫn Trang chủ

Bạn muốn tìm hiểu cách làm việc với Django và Postgres? Xem bài viết Dockerizing Django với Postgres, Gunicorn và Nginx .

Lưu ý về Quotemô hình trong dấu ngoặc kép / models.py :

from django.db import models

class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)

    def __str__(self):
        return self.quote

Tiếp theo, chạy lệnh quản lý sau để thêm 10.000 dấu ngoặc kép vào cơ sở dữ liệu:

$ docker-compose exec web python manage.py add_quotes

Quá trình này sẽ mất vài phút. Sau khi hoàn tất, hãy điều hướng đến http://127.0.0.1:8011/quotes/ để xem dữ liệu.

Đầu ra của dạng xem được lưu trong bộ nhớ cache trong năm phút, vì vậy bạn có thể muốn nhận xét @method_decoratortrong ngoặc kép / views.py để tải các trích dẫn. Đảm bảo xóa nhận xét sau khi hoàn tất.

Trích dẫn Trang chủ

Trong tệp dấu ngoặc kép / mẫu / quote.html , bạn có một biểu mẫu cơ bản với trường nhập tìm kiếm:

<form action="{% url 'search_results' %}" method="get">
  <input
    type="search"
    name="q"
    placeholder="Search by name or quote..."
    class="form-control"
  />
</form>

Khi gửi, biểu mẫu sẽ gửi dữ liệu đến phần phụ trợ. Yêu GETcầu được sử dụng thay vì sử dụng POSTtheo cách đó, chúng tôi có quyền truy cập vào chuỗi truy vấn cả trong URL và trong chế độ xem Django, cho phép người dùng chia sẻ kết quả tìm kiếm dưới dạng liên kết.

Trước khi tiếp tục, hãy xem nhanh cấu trúc dự án và phần còn lại của mã.

Tìm kiếm cơ bản

Khi nói đến tìm kiếm, với Django, thông thường bạn sẽ bắt đầu bằng cách thực hiện các truy vấn tìm kiếm với containshoặc icontainsđối với các kết quả phù hợp chính xác. Đối tượng Q cũng có thể được sử dụng để thêm toán tử logic AND ( &) hoặc OR ( ).|

Ví dụ: bằng cách sử dụng toán tử OR, ghi đè SearchResultsListmặc định của ' QuerySettrong dấu ngoặc kép / views.py như sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(
            Q(name__icontains=query) | Q(quote__icontains=query)
        )

Ở đây, chúng tôi đã sử dụng phương pháp bộ lọc để lọc theo namehoặc quotecác trường. Hơn nữa, chúng tôi cũng sử dụng tiện ích mở rộng icontains để kiểm tra xem truy vấn có xuất hiện trong các trường namehoặc quote(phân biệt chữ hoa chữ thường) hay không. Kết quả dương tính sẽ được trả về nếu tìm thấy kết quả trùng khớp.

Đừng quên nhập:

from django.db.models import Q

Hãy dùng thử:

Trang tìm kiếm

For small data sets, this is a great way to add basic search functionality to your app. If you're dealing with a large data set or want search functionality that feels like an Internet search engine, you'll want to move to full-text search.

Full-text Search

The basic search that we saw earlier has several limitations especially when you want to perform complex lookups.

As mentioned, with basic search, you can only perform exact matches.

Một hạn chế khác là stop words . Các từ dừng là những từ như "a", "an" và "the". Những từ này là phổ biến và không đủ ý nghĩa, do đó chúng nên được bỏ qua. Để kiểm tra, hãy thử tìm kiếm một từ có "the" ở phía trước. Giả sử bạn đã tìm kiếm "ở giữa". Trong trường hợp này, bạn sẽ chỉ thấy kết quả cho "giữa", vì vậy bạn sẽ không thấy bất kỳ kết quả nào có từ "giữa" mà không có "cái" trước nó.

Giả sử bạn có hai câu sau:

  1. Tôi ở giữa.
  2. Bạn không thích trường cấp hai.

Bạn sẽ nhận được những thông tin sau được trả về với mỗi loại tìm kiếm:

Truy vấnTìm kiếm cơ bảnTìm kiếm toàn văn
"giữa"11 và 2
"ở giữa"1 và 21 và 2

Một vấn đề khác là bỏ qua những từ tương tự. Với tìm kiếm cơ bản, chỉ các kết quả phù hợp chính xác mới được trả về. Tuy nhiên, với tìm kiếm toàn văn, các từ tương tự được tính đến. Để kiểm tra, hãy cố gắng tìm một số từ tương tự như "pony" và "ponies". Với tìm kiếm cơ bản, nếu bạn tìm kiếm "ngựa con", bạn sẽ không thấy kết quả có chứa "ngựa con" - và ngược lại.

Giả sử bạn có hai câu này.

  1. Tôi là một con ngựa.
  2. Bạn không thích ngựa con

Bạn sẽ nhận được những thông tin sau được trả về với mỗi loại tìm kiếm:

Truy vấnTìm kiếm cơ bảnTìm kiếm toàn văn
"ngựa con"11 và 2
"ngựa con"21 và 2

Với tìm kiếm toàn văn, cả hai vấn đề này đều được giảm thiểu. Tuy nhiên, hãy nhớ rằng tùy thuộc vào mục tiêu của bạn, tìm kiếm toàn văn có thể thực sự làm giảm độ chính xác (chất lượng) và khả năng thu hồi (số lượng kết quả có liên quan). Thông thường, tìm kiếm toàn văn ít chính xác hơn tìm kiếm cơ bản, vì tìm kiếm cơ bản mang lại kết quả khớp chính xác. Điều đó nói rằng, nếu bạn đang tìm kiếm thông qua các tập dữ liệu lớn với các khối văn bản lớn, thì tìm kiếm toàn văn được ưu tiên hơn vì nó thường nhanh hơn nhiều.

Tìm kiếm toàn văn bản là một kỹ thuật tìm kiếm nâng cao kiểm tra tất cả các từ trong mọi tài liệu được lưu trữ khi nó cố gắng khớp với các tiêu chí tìm kiếm. Ngoài ra, với tìm kiếm toàn văn, bạn có thể sử dụng nguồn gốc ngôn ngữ cụ thể trên các từ được lập chỉ mục. Ví dụ: từ "drive", "drive" và "drive" sẽ được ghi trong khái niệm duy nhất từ ​​"drive". Rút gọn là quá trình rút gọn các từ thành dạng gốc, cơ sở hoặc gốc từ của chúng.

Đủ để nói rằng tìm kiếm toàn văn không phải là hoàn hảo. Nó có khả năng truy xuất nhiều tài liệu không liên quan (dương tính giả) với truy vấn tìm kiếm dự định. Tuy nhiên, có một số kỹ thuật dựa trên thuật toán Bayes có thể giúp giảm thiểu các vấn đề như vậy.

Để tận dụng tính năng tìm kiếm toàn văn của Postgres với Django, hãy thêm django.contrib.postgresvào INSTALLED_APPSdanh sách của bạn:

INSTALLED_APPS = [
    ...

    "django.contrib.postgres",  # new
]

Tiếp theo, chúng ta hãy xem xét hai ví dụ nhanh về tìm kiếm toàn văn, trên một trường duy nhất và trên nhiều trường.

Tìm kiếm trường đơn

Cập nhật get_querysetchức năng dưới chức SearchResultsListnăng xem như sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(quote__search=query)

Ở đây, chúng tôi thiết lập tìm kiếm toàn văn dựa trên một trường duy nhất - trường trích dẫn.

Trang tìm kiếm

Như bạn có thể thấy, cần tính đến những từ tương tự. Trong ví dụ trên, "ngựa con" và "ngựa con" được coi là những từ tương tự.

Tìm kiếm nhiều trường

Để tìm kiếm đối với nhiều trường và trên các mô hình liên quan, bạn có thể sử dụng SearchVectorlớp.

Một lần nữa, hãy cập nhật SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.annotate(search=SearchVector("name", "quote")).filter(
            search=query
        )

To search against multiple fields, you annotated the queryset using a SearchVector. The vector is the data that you're searching for, which has been converted into a form that is easy to search. In the example above, this data is the name and quote fields in your database.

Make sure to add the import:

from django.contrib.postgres.search import SearchVector

Try some searches out.

Stemming and Ranking

In this section, you'll combine several methods such as SearchVector, SearchQuery, and SearchRank to produce a very robust search that uses both stemming and ranking.

Again, stemming is the process of reducing words to their word stem, base, or root form. With stemming, words like "child" and "children" will be treated as similar words. Ranking, on the other hand, allows us to order results by relevancy.

Update SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", "quote")
        search_query = SearchQuery(query)
        return (
            Quote.objects.annotate(
                search=search_vector, rank=SearchRank(search_vector, search_query)
            )
            .filter(search=search_query)
            .order_by("-rank")
        )

What's happening here?

  1. SearchVector - again you used a search vector to search against multiple fields. The data is converted into another form since you're no longer just searching the raw text like you did when icontains was used. Therefore, with this, you will be able to search plurals easily. For example, searching for "flask" and "flasks" will yield the same search because they are, well, basically the same thing.
  2. SearchQuery- dịch các từ được cung cấp cho chúng tôi dưới dạng truy vấn từ biểu mẫu, chuyển chúng qua một thuật toán bắt nguồn và sau đó nó tìm kiếm các kết quả phù hợp cho tất cả các cụm từ kết quả.
  3. SearchRank- cho phép chúng tôi sắp xếp các kết quả theo mức độ liên quan. Nó tính đến tần suất các thuật ngữ truy vấn xuất hiện trong tài liệu, mức độ gần gũi của các thuật ngữ trên tài liệu và phần quan trọng của tài liệu là nơi chúng xuất hiện.

Thêm nhập khẩu:

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank

Trang tìm kiếm

So sánh kết quả từ tìm kiếm cơ bản với tìm kiếm toàn văn. Có một sự khác biệt rõ ràng. Trong tìm kiếm toàn văn, truy vấn có kết quả cao nhất được hiển thị đầu tiên. Đây là sức mạnh của SearchRank. Kết hợp SearchVectorSearchQuerySearchRankmột cách nhanh chóng để tạo ra một tìm kiếm chính xác và mạnh mẽ hơn nhiều so với tìm kiếm cơ bản.

Thêm trọng lượng

Tìm kiếm toàn văn cung cấp cho chúng tôi khả năng thêm tầm quan trọng cho một số trường trong bảng của chúng tôi trong cơ sở dữ liệu so với các trường khác. Chúng ta có thể đạt được điều này bằng cách thêm trọng số vào các truy vấn của mình.

Trọng lượng phải là một trong các chữ cái sau D, C, B, A. Theo mặc định, các trọng số này lần lượt là các số 0,1, 0,2, 0,4 và 1,0.

Cập nhật SearchResultsList:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", weight="B") + SearchVector(
            "quote", weight="A"
        )
        search_query = SearchQuery(query)
        return (
            Quote.objects.annotate(rank=SearchRank(search_vector, search_query))
            .filter(rank__gte=0.3)
            .order_by("-rank")
        )

Ở đây, bạn đã thêm trọng số vào việc SearchVectorsử dụng cả trường namequote. Trọng số 0,4 và 1,0 lần lượt được áp dụng cho các trường tên và trích dẫn. Do đó, các trận đấu trích dẫn sẽ chiếm ưu thế hơn các trận đấu nội dung tên. Cuối cùng, bạn lọc kết quả để chỉ hiển thị những kết quả lớn hơn 0,3.

Thêm bản xem trước vào kết quả tìm kiếm

Trong phần này, bạn sẽ thêm một bản xem trước kết quả tìm kiếm của mình thông qua phương pháp SearchHeadline . Điều này sẽ làm nổi bật truy vấn kết quả tìm kiếm.

Cập nhật SearchResultsListlại:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        search_vector = SearchVector("name", "quote")
        search_query = SearchQuery(query)
        search_headline = SearchHeadline("quote", search_query)
        return Quote.objects.annotate(
            search=search_vector,
            rank=SearchRank(search_vector, search_query)
        ).annotate(headline=search_headline).filter(search=search_query).order_by("-rank")

Các SearchHeadlinediễn biến trong lĩnh vực bạn muốn xem trước. Trong trường hợp này, đây sẽ là quotetrường cùng với truy vấn, sẽ được in đậm.

Đảm bảo thêm nhập:

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank, SearchHeadline

Trước khi thử một số tìm kiếm, hãy cập nhật <li></li>trong dấu ngoặc kép / template / search.html như sau:

<li>{{ quote.headline | safe }} - <b>By <i>{{ quote.name }}</i></b></li>

Bây giờ, thay vì hiển thị các trích dẫn như bạn đã làm trước đây, chỉ một bản xem trước của trường trích dẫn đầy đủ được hiển thị cùng với truy vấn tìm kiếm được đánh dấu.

Tăng hiệu suất

Tìm kiếm toàn văn là một quá trình chuyên sâu. Để chống lại hiệu suất chậm, bạn có thể:

  1. Lưu các vectơ tìm kiếm vào cơ sở dữ liệu với SearchVectorField . Nói cách khác, thay vì chuyển đổi các chuỗi thành các vectơ tìm kiếm một cách nhanh chóng, chúng tôi sẽ tạo một trường cơ sở dữ liệu riêng có chứa các vectơ tìm kiếm đã xử lý và cập nhật trường bất cứ khi nào có chèn hoặc cập nhật cho hoặc các quotetrường name.
  2. Tạo chỉ mục cơ sở dữ liệu , là một cấu trúc dữ liệu giúp nâng cao tốc độ của quá trình truy xuất dữ liệu trên cơ sở dữ liệu. Do đó, nó tăng tốc độ truy vấn. Postgres cung cấp cho bạn một số chỉ mục để làm việc có thể áp dụng cho các trường hợp khác nhau. GinIndex được cho là phổ biến nhất.

To learn more about performance with full-text search, review the Performance section from the Django docs.

Search Vector Field

Start by adding a new SearchVectorField field to the Quote model in quotes/models.py:

from django.contrib.postgres.search import SearchVectorField  # new
from django.db import models


class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)
    search_vector = SearchVectorField(null=True)  # new

    def __str__(self):
        return self.quote

Create the migration file:

$ docker-compose exec web python manage.py makemigrations

Now, you can only populate this field when the quote or name objects already exists in the database. Thus, we need to add a trigger to update the search_vector field whenever the quote or name fields are updated. To achieve this, create a custom migration file in "quotes/migrations" called 0003_search_vector_trigger.py:

from django.contrib.postgres.search import SearchVector
from django.db import migrations


def compute_search_vector(apps, schema_editor):
    Quote = apps.get_model("quotes", "Quote")
    Quote.objects.update(search_vector=SearchVector("name", "quote"))


class Migration(migrations.Migration):

    dependencies = [
        ("quotes", "0002_quote_search_vector"),
    ]

    operations = [
        migrations.RunSQL(
            sql="""
            CREATE TRIGGER search_vector_trigger
            BEFORE INSERT OR UPDATE OF name, quote, search_vector
            ON quotes_quote
            FOR EACH ROW EXECUTE PROCEDURE
            tsvector_update_trigger(
                search_vector, 'pg_catalog.english', name, quote
            );
            UPDATE quotes_quote SET search_vector = NULL;
            """,
            reverse_sql="""
            DROP TRIGGER IF EXISTS search_vector_trigger
            ON quotes_quote;
            """,
        ),
        migrations.RunPython(
            compute_search_vector, reverse_code=migrations.RunPython.noop
        ),
    ]

Depending on your project structure, you may need to update the name of the previous migration file in dependencies.

Áp dụng các di chuyển:

$ docker-compose exec web python manage.py migrate

Để sử dụng trường mới cho các tìm kiếm, hãy cập nhật SearchResultsListnhư sau:

class SearchResultsList(ListView):
    model = Quote
    context_object_name = "quotes"
    template_name = "search.html"

    def get_queryset(self):
        query = self.request.GET.get("q")
        return Quote.objects.filter(search_vector=query)

Cập nhật lại <li></li>trong ngoặc kép / template / search.html :

<li>{{ quote.quote | safe }} - <b>By <i>{{ quote.name }}</i></b></li>

Mục lục

Cuối cùng, hãy thiết lập một chỉ số chức năng, GinIndex .

Cập nhật Quotemô hình:

from django.contrib.postgres.indexes import GinIndex  # new
from django.contrib.postgres.search import SearchVectorField
from django.db import models


class Quote(models.Model):
    name = models.CharField(max_length=250)
    quote = models.TextField(max_length=1000)
    search_vector = SearchVectorField(null=True)

    def __str__(self):
        return self.quote

    # new
    class Meta:
        indexes = [
            GinIndex(fields=["search_vector"]),
        ]

Tạo và áp dụng di chuyển lần cuối:

$ docker-compose exec web python manage.py makemigrations
$ docker-compose exec web python manage.py migrate

Kiểm tra nó ra.

Sự kết luận

Trong hướng dẫn này, bạn đã được hướng dẫn cách thêm tìm kiếm toàn văn và cơ bản vào ứng dụng Django. Chúng tôi cũng đã xem xét cách tối ưu hóa chức năng tìm kiếm toàn văn bằng cách thêm trường vectơ tìm kiếm và chỉ mục cơ sở dữ liệu.

Lấy mã hoàn chỉnh từ kho tìm kiếm django .

Nguồn:  https://testdriven.io

#django #postgres 

Ahebwe  Oscar

Ahebwe Oscar

1620177818

Django admin full Customization step by step

Welcome to my blog , hey everyone in this article you learn how to customize the Django app and view in the article you will know how to register  and unregister  models from the admin view how to add filtering how to add a custom input field, and a button that triggers an action on all objects and even how to change the look of your app and page using the Django suit package let’s get started.

Database

Custom Titles of Django Admin

Exclude in Django Admin

Fields in Django Admin

#django #create super user django #customize django admin dashboard #django admin #django admin custom field display #django admin customization #django admin full customization #django admin interface #django admin register all models #django customization

Ahebwe  Oscar

Ahebwe Oscar

1620185280

How model queries work in Django

How model queries work in Django

Welcome to my blog, hey everyone in this article we are going to be working with queries in Django so for any web app that you build your going to want to write a query so you can retrieve information from your database so in this article I’ll be showing you all the different ways that you can write queries and it should cover about 90% of the cases that you’ll have when you’re writing your code the other 10% depend on your specific use case you may have to get more complicated but for the most part what I cover in this article should be able to help you so let’s start with the model that I have I’ve already created it.

**Read More : **How to make Chatbot in Python.

Read More : Django Admin Full Customization step by step

let’s just get into this diagram that I made so in here:

django queries aboutDescribe each parameter in Django querset

we’re making a simple query for the myModel table so we want to pull out all the information in the database so we have this variable which is gonna hold a return value and we have our myModel models so this is simply the myModel model name so whatever you named your model just make sure you specify that and we’re gonna access the objects attribute once we get that object’s attribute we can simply use the all method and this will return all the information in the database so we’re gonna start with all and then we will go into getting single items filtering that data and go to our command prompt.

Here and we’ll actually start making our queries from here to do this let’s just go ahead and run** Python manage.py shell** and I am in my project file so make sure you’re in there when you start and what this does is it gives us an interactive shell to actually start working with our data so this is a lot like the Python shell but because we did manage.py it allows us to do things a Django way and actually query our database now open up the command prompt and let’s go ahead and start making our first queries.

#django #django model queries #django orm #django queries #django query #model django query #model query #query with django

Ahebwe  Oscar

Ahebwe Oscar

1624131000

Basic and Full-text Search with Django and Postgres

Unlike relational databases, full-text search is not standardized. There are a number of open-source options like ElasticSearch, Solr, and Xapian. ElasticSearch is probably the most popular solution; however, it’s complicated to set up and maintain. Further, if you’re not taking advantage of some of the advanced features that ElasticSearch offers, you should stick with the full-text search capabilities that many relational (like Postgres, MySQL, SQLite) and non-relational databases (like MongoDB and CouchDB) offer. Postgres in particular is well-suited for full-text search. Django supports it out-of-the-box as well.

For the vast majority of your Django apps, you should, at the very least, start out with leveraging full-text search from Postgres before looking to a more powerful solution like ElasticSearch or Solr.

In this article, we’ll add basic and full-text search to a Django app with Postgres.

Objectives

By the end of this article, you should be able to:

  1. Set up basic search functionality in a Django app with the Q object
  2. Add full-text search to a Django app
  3. Sort full-text search results by relevance using stemming, ranking, and weighting

#basic and full-text search with django and postgres #django #search lookup #postgres #full-text search #postgres full text search

Ananya Gupta

Ananya Gupta

1597123834

Main Pros and Cons of Django As A Web Framework for Python Developers

Django depicts itself as “the web system for fussbudgets with cutoff times”. It was intended to help Python engineers take applications from idea to consummation as fast as could be expected under the circumstances.

It permits fast turn of events on the off chance that you need to make a CRUD application with batteries included. With Django, you won’t need to rehash an already solved problem. It just works and lets you center around your business rationale and making something clients can utilize.

Pros of Django

“Batteries included” theory

The standard behind batteries-included methods normal usefulness for building web applications accompanies the system, not as isolated libraries.

Django incorporates much usefulness you can use to deal with normal web advancement undertakings. Here are some significant level functionalities that Django gives you, which else you need to stay together if you somehow happened to utilize a small scale structure:

ORM

Database relocations

Client validation

Administrator board

Structures

Normalized structure

Django as a system proposes the right structure of an undertaking. That structure helps designers in making sense of how and where to execute any new component.

With a generally acknowledged venture structure that is like numerous tasks, it is a lot simpler to discover online good arrangements or approach the network for help. There are numerous energetic Python designers who will assist you with comprehending any issue you may experience.

Django applications

Django applications (or applications for short) permit designers to separate a task into numerous applications. An application is whatever is introduced by putting in settings.INSTALLED_APPS. This makes it simpler for engineers to add usefulness to the web application by coordinating outer Django applications into the venture.

There are many reusable modules and applications to accelerate your turn of events learn through Online Django Class and Check the Django website.

Secure of course

Django gives great security assurance out of the crate and incorporates avoidance components for basic assaults like SQL Injection (XSS) and Cross-site Request Forgery (CSRF). You can discover more subtleties in the official security diagram control.

REST structure for building APIs

Django REST Framework, commonly condensed “DRF”, is a Python library for building APIs. It has secluded and adaptable engineering that functions admirably for both straightforward and complex web APIs.

DRF gives a lot of verification and authorization strategies out of the case. It is an adaptable, full-included library with measured and adjustable engineering. It accompanies nonexclusive classes for CRUD tasks and an implicit API program for testing API endpoints.

GraphQL structure for building APIs

Huge REST APIs regularly require a lot of solicitations to various endpoints to recover every single required datum. GraphQL it’s a question language that permits us to share related information in a lot simpler design. For a prologue to GraphQL and an outline of its ideas, if it’s not too much trouble allude to the authority GraphQL documentation.

Graphene-Django gives reflections that make it simple to add GraphQL usefulness to your Django venture. Ordinary Django models, structures, validation, consent arrangements, and different functionalities can be reused to manufacture GraphQL blueprint. It additionally gives an implicit API program for testing API endpoints.

Cons of Django

Django ORM

Django ORM, made before SQLAlchemy existed, is currently much sub-par compared to SQLAlchemy. It depends on the Active Record design which is more regrettable than the Unit of Work design embraced by SQLAlchemy. This implies, in Django, models can “spare” themselves and exchanges are off as a matter of course, they are a bit of hindsight. Peruse more in Why I kind of aversion Django.

Django advances course popularity increses day by day:

Django is huge and is viewed as strong bit of programming. This permits the network to create several reusable modules and applications yet has additionally restricted the speed of advancement of the Django. On head of that Django needs to keep up in reverse similarity, so it advances gradually.

Rundown - Should I use Django as a Python designer?

While Django ORM isn’t as adaptable as SQLAlchemy and the enormous environment of reusable modules and applications hinders structure advancement - plainly Django ought to be the best option web system for Python engineers.

Elective, light systems, similar to Flask, while offering a retreat from Django huge biological system and designs, in the long haul can require substantially more additional libraries and usefulness, in the end making many experienced Python engineers winding up wishing they’d began with Django.

Django undertaking’s security and network have become enormously over the previous decade since the system’s creation. Official documentation and instructional exercises are probably the best anyplace in programming advancement. With each delivery, Django keeps on including huge new usefulness.

#django online training #django online course #online django course #django course #django training #django certification course