Creare un applicazione blog con django, parte 4: queryset e manager in django

Ora che hai un sito di amministrazione completamente funzionante per gestire i contenuti del tuo blog, è tempo di imparare come recuperare informazioni dal database e interagire con esso. Django viene fornito di una API (Application Programming Interface) di database che consente di creare, recuperare, aggiornare ed eliminare oggetti facilmente. L'Object-relational mapper (ORM) di Django è compatibile con MySQL, PostgreSQL, SQLite ed Oracle. Tenere presente che puoi definire il database del tuo progetto nella voce DATABASES del file settings.py di tuo progetto. Django può lavorare con più database contemporaneamente ed è possibile programmare i router di database per creare schemi di routing personalizzati.

L'object-relational mapping (ORM) di Django è basato su QuerySets. Un QuerySet è una lista di oggetti di un determinato modello. I QuerySets consentono di leggere i dati dal database, filtrarli e ordinarli. Puoi trovare ulteriori informazioni su Querysets Django qui .

Utilizzare il metodo filter()

Per filtrare un QuerySet, è possibile utilizzare il metodo filter() del manager. Ad esempio, possiamo recuperare tutti i post pubblicati nell'anno 2019 utilizzando il seguente QuerySet:

Post.objects.filter(publish__year=2019)

Puoi anche filtrare per più campi. Ad esempio, possiamo recuperare tutti i post pubblicati nel 2019 dall'autore con il nome utente admin:

Post.objects.filter(publish__year=2019, author__username='admin')

Utilizzare il metodo order_by()

Puoi ordinare i risultati in diversi campi utilizzando il metodo order_by() del manager. Ad esempio, è possibile recuperare tutti gli oggetti ordinati in base al titolo, come seguente:

Post.objects.order_by('title')

L'ordine crescente è implicito. Puoi indicare l'ordine decrescente con un prefisso di segno negativo, in questo modo:

Post.objects.order_by('-title')

Puoi trovare ulteriori informazioni sui metodi che restituiscono nuovi Querysets qui .

Creare i manager

In un modello Django, il Manager è l'interfaccia che interagisce con il database, objects è il gestore predefinito di ogni modello che recupera tutti gli oggetti nel database. Tuttavia, possiamo anche definire gestori personalizzati per i nostri modelli. Creeremo un gestore personalizzato per recuperare tutti i post con lo stato published.

Esistono due modi per aggiungere gestori ai modelli: è possibile aggiungere metodi di gestione extra o modificare i QuerySet del gestore iniziale. Il primo metodo fornisce un'API QuerySet come Post.objects.my_manager() e il secondo fornisce Post.my_manager.all(). Il gestore ci consentirà di recuperare i post utilizzando Post.published.all().

Modifica il file blog/models.py della tua applicazione blog per aggiungere il gestore personalizzato, in questo modo:

# blog/models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class PublishedManager(models.Manager):
   def get_queryset(self):
       # Displays only published post
       return super().get_queryset().filter(status='published')  # ========= New lines

class Post(models.Model):
   STATUS_CHOICES = (
       ('draft', 'Draft'),
       ('published', 'Published'),
   )
   title = models.CharField(max_length=250)
   slug = models.SlugField(max_length=250,
                           unique_for_date='publish')
   author = models.ForeignKey(User,
                              on_delete=models.CASCADE,
                              related_name='blog_posts')
   body = models.TextField()
   publish = models.DateTimeField(default=timezone.now)
   created = models.DateTimeField(auto_now_add=True)
   updated = models.DateTimeField(auto_now=True)
   status = models.CharField(max_length=10,
                             choices=STATUS_CHOICES,
                             default='draft')

   objects = models.Manager() # The default manager. ============== New line
   published = PublishedManager() # The custom manager. =========== New line

   class Meta:
       ordering = ('-publish',)

   def __str__(self):
       return self.title

Per ora è tutto. Il prossimo tutorial è imparare a scrivere viste Django.


Se ti piace il mio contenuto, supportami! grazie.

Post correlati