[PYTHON] [Débutant] Récupérer de la base de données Django Query

Dans l'article Django pour débutants que j'ai écrit il y a longtemps, celui qui a été relativement plus accédé que d'autres était l'acquisition de la DB de Django, même si ce n'était pas si bon.

Cette fois, j'écrirai comment obtenir une requête pour les débutants qui étudient

Suite: Relation [Débutant] # 2 Django Query Query Database Acquisition 1-to-Many and Many-to-Many

Article précédent: Obtenir à partir de la base de données et rendre [Python Django] Application Web pour les programmeurs débutants # 5 [Gestion des valeurs de base de données]

image.png

environnement

Si vous voulez CRUD avec Django, vérifiez avec shell

Il est gênant de l'afficher sur la page pour le vérifier un par un, alors utilisons shell.

Préparation

Le modèle utilisé cette fois ressemble à ceci Le nom de l'application est comptes.

accounts/models.py


class Customer(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=255)
    age = models.integerField()
    created_at = models.DateTimeField(auto_now_add=True)

Comment créer une application pour s'entraîner et saisir des données

Si vous étudiez, procédez comme suit et essayez-le.

$ django-admin startproject test
$ cd test
$ python manage.py startapp accounts

Modifier settings.py

Ajoutez l'application à votre projet.

myproject\settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'accounts', #ajouter à
]

Écrivez le code pour models.py plus tôt

$ python manage.py makemigrations
$ python manage.py migrate

Suivant si des données existent déjà

S'il n'y a pas de données

$ python manage.py createsuperuser

Après avoir créé l'écran de gestion avec, créez les informations utilisateur en insérant le superutilisateur. Il ne s'affichera que si vous l'enregistrez dans admin.py.

test/accounts/admin.py


from django.contrib import admin
from .models import Customer

admin.site.register(Customer)

Accédez à http: //127.0.0.1: 8000 / admin et connectez-vous. スクリーンショット 2020-09-21 0.35.07.png

Vous pouvez l'ajouter avec "AJOUTER UN CLIENT".

Obtenez des données Django avec shell et test

$ python manage.py shell

Veuillez l'importer car il ne peut être utilisé que si le modèle est chargé.

>>> from accounts.models import *
>>> customer = Customer.objects.all()
>>> customer
<QuerySet [<Customer: Sato>, <Customer: Tanaka>]>

Vous pouvez l'obtenir comme ça.

Obtenir une requête de base

Nom du modèle.objects.all() #Obtenez toutes les données
Nom du modèle.objects.get(id=2) # id =Acquisition de données de 2
Nom du modèle.objects.get(name='Sato') # name = 'Sato'L'acquisition des données
Nom du modèle.objects.first() #Obtenez les toutes premières données du tableau
Nom du modèle.objects.last() #Obtenez les dernières données enregistrées dans le tableau
Nom du modèle.objects.filter(name='Sato') #Spécification de la condition
Nom du modèle.objects.filter(name__startwith='T') #Obtenir des personnes dont le nom commence par T
Nom du modèle.objects.filter(name='Sato', age__gte=20) #M. Sato plus de 20 ans

obtenir et filtrer

Si les données ne peuvent pas être acquises par get (), l'erreur DoesNotExist est renvoyée. De plus, si deux conditions ou plus sont remplies, une erreur se produit. Si les données ne peuvent pas être obtenues par filtre, un ensemble de requêtes vide est renvoyé. Vous devez utiliser get lorsque le traitement devient étrange si vous ne pouvez pas obtenir de données fiables.

Il peut également être spécifié par la clé primaire quel que soit le nom, tel que ʻaccounts.objects.get (pk = 2) `.

Regardons un exemple.

>>> customer_filter = Customer.objects.filter(id=1)
>>> customer_filter
<QuerySet [<Customer: Sato>]>
>>> customer_get = Customer.objects.get(id=1)
>>> customer_get
<Customer: Sato>

Un QuerySet est un tableau ou une collection d'enregistrements. Si vous l'obtenez avec filter, vous devez le récupérer avec for.

customer_filter.name est une erreur. customer_get.name est traité correctement. En gros, QuerySet est une collection de données qui peuvent être obtenues par get. Donc, si vous sortez un par un avec for, vous pouvez le gérer de la même manière.

>>> customer_filter = Customer.objects.filter(id=1)
>>> customer_filter.name

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'name'

>>> customer_filter = Customer.objects.filter(id=1)
>>> for c in customer_filter:
...     c.name
... 
'Sato'

Méthode pratique d'acquisition de l'état

startswit, endwith Je l'ai écrit comme filter (name__startwith = 'T'),

Commence par startswit ~ ʻEndwith` se termine par

Il peut être obtenu dans les conditions suivantes.

Ci-dessus, ci-dessous, ci-dessous, dessus

Je l'ai écrit comme ʻage__gte = 20`, mais vous pouvez utiliser quelque chose comme ce qui suit. Plus de 20 ans dans la colonne âge.

gt	(greater than)Super
gte	(greater than equal)c'est tout
lt	(less than)Moins que
lte	(less than equal)Moins que

Il est possible de chevaucher diverses conditions

Nom du modèle.objects.all().order_by('id') #colonne id triée par ordre croissant
Nom du modèle.objects.all().order_by('-id') #colonne id triée par ordre décroissant
Nom du modèle.objects.all().filter(name='Sato').reverse() #Obtenu par M. Sato. Obtenir les données Queryset en sens inverse
Nom du modèle.objects.all().filter(name='Sato').count() #Le nombre de Sato
Nom du modèle.objects.values('email').distinct() #Supprimer les données en double dans la colonne e-mail

limite: spécifiez le nombre d'acquisitions

Nom du modèle.objects.all()[:5] #Obtenez 5(Limit 5)
Nom du modèle.objects.all()[5:10] # 5~Obtenez 10(OFFSET 5 LIMIT 5)

Je veux l'obtenir avec le dictionnaire

Il peut être plus facile à traiter s'il peut être obtenu sous forme de dictionnaire lorsqu'il est obtenu à partir de la base de données.

Référence: https://docs.djangoproject.com/ja/3.1/ref/models/querysets/#values

>>> Blog.objects.filter(name__startswith='Beatles').values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>

Si vous l'obtenez normalement, il est difficile de le traiter car il est dictinaire même si vous tournez le QuerySet avec for et le retirez, mais si vous ajoutez value comme décrit ci-dessus, vous pouvez l'utiliser comme si vous pouviez obtenir le contenu de l'enregistrement avec dictinary.

Obtenez avec taple (si la clé est sur le chemin)

liste_valeurs est similaire aux valeurs, mais ne renvoie que les valeurs.

Référence: https://docs.djangoproject.com/ja/3.1/ref/models/querysets/#values-list

Quand il est ennuyeux que la clé soit attachée, comme l'analyse, l'écriture en CSV, le besoin de passer en liste lors de l'utilisation de la bibliothèque.

>>> Entry.objects.values_list('id', 'headline')
<QuerySet [(1, 'First entry'), ...]>
>>> from django.db.models.functions import Lower
>>> Entry.objects.values_list('id', Lower('headline'))
<QuerySet [(1, 'first entry'), ...]>

Choses à savoir une fois que vous vous y êtes habitué

Si vous créez simplement des QuerySets, vous n'accédez pas à la base de données.

>>> q = accounts.objects.filter(name__startswith="T")
>>> q = q.filter(created_at__lte=datetime.date.today())
>>> q = q.exclude(age__gte=30)
>>> print(q)

On dirait que vous accédez à la base de données trois fois, mais ce n'est en fait que le dernier print (q). Bien que le développement soit petit, c'est peut-être ce qui se passe, mais je l'ai écrit parce que je crains de lancer plusieurs fois un traitement lourd à la base de données.

référence

https://docs.djangoproject.com/ja/3.1/topics/db/queries/ https://docs.djangoproject.com/ja/3.1/ref/models/querysets/

Nous continuerons d'en ajouter d'autres à l'avenir.

Suite: Relation

[Débutant] # 2 Django Query Query Database Acquisition 1-to-Many and Many-to-Many

Recommended Posts

[Débutant] Récupérer de la base de données Django Query
Récupérer la chaîne de requête (chaîne de requête) avec Django
Obtenir les paramètres de requête pour les requêtes GET avec Django
Récupérez uniquement le texte du formulaire Django.
Django memo n ° 1 à partir de zéro
Obtenir des données de la base de données via ODBC avec Python (Access)
Obtenir les données structurelles de CHEMBLID
Django à partir de zéro (partie: 2)
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
Django à partir de zéro (partie: 1)
Obtenir les paramètres de requête pour Flask GET
Générer une requête URL à partir de JSON
Interroger Athena depuis Lambda Python
Obtenir le presse-papiers à partir des paramètres Maya
Lancez-vous avec Django! ~ Tutoriel ⑥ ~
Utiliser le modèle django de l'interpréteur
Enregistrement du modèle depuis Django Bootstrap
Installation de Django PostgreSQL, construction de bases de données