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]
Il est gênant de l'afficher sur la page pour le vérifier un par un, alors utilisons shell.
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)
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.
Vous pouvez l'ajouter avec "AJOUTER UN CLIENT".
$ 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.
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
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'
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.
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
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
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)
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.
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'), ...]>
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.
https://docs.djangoproject.com/ja/3.1/topics/db/queries/ https://docs.djangoproject.com/ja/3.1/ref/models/querysets/
[Débutant] # 2 Django Query Query Database Acquisition 1-to-Many and Many-to-Many
Recommended Posts