Comprendre Django ORM

Oct 08, 2024 pm 08:11 PM

Understanding Django ORM

Qu’est-ce que l’ORM ?

Le mappage objet-relationnel (ORM) est une fonctionnalité de Django qui nous permet d'interagir avec des bases de données en utilisant du code Python sans écrire de requêtes SQL. L'ORM traduit les opérations CRUD en SQL sous le capot, permettant ainsi une création, une récupération, une mise à jour et une suppression faciles d'objets de base de données.

Travailler avec ORM

Dans Django, une classe modèle représente une table de base de données et une instance de cette classe représente un enregistrement dans la table.

Chaque modèle a au moins un Manager, appelé objets. Nous pouvons récupérer des enregistrements de la base de données via ce gestionnaire, ce qui donne un QuerySet.

Les QuerySets sont paresseux, ce qui signifie que les résultats ne sont récupérés que lorsqu'ils sont explicitement demandés.

Méthodes QuerySet courantes
filter() : Récupère les enregistrements correspondant à certains critères.
all() : Récupère tous les enregistrements.
order_by() : commande les enregistrements en fonction de champs spécifiques.
distinct() : renvoie des enregistrements uniques.
annotate() : ajoutez des valeurs globales à chaque enregistrement.
Aggregate() : Calcule une valeur à partir d'un ensemble de requêtes.
defer() : Charger uniquement certains champs d'un modèle, en différant les autres.

Fonctionnalités ORM avancées

Les

Objets Q et F permettent des requêtes complexes et des opérations efficaces au niveau de la base de données. Nous pouvons utiliser « Q » pour les requêtes qui impliquent des conditions OU, tandis que « F » vous permet de référencer les champs du modèle directement dans les requêtes.

from django.db.models import Q, F

# Using Q to filter published posts or created after a specific date
posts = Post.objects.filter(Q(status='published') | Q(created_at__gte='2024-01-01'))

# Using F to compare fields within a model (e.g., for a discount calculation)
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    discounted_price = models.DecimalField(max_digits=10, decimal_places=2)

# Retrieve products where discounted price is less than price
discounted_products = Product.objects.filter(discounted_price__lt=F('price'))
Les

Expressions de requête (référençant les champs du modèle) et les Fonctions de base de données (appliquant des fonctions de type SQL) nous permettent toutes deux d'effectuer des opérations au niveau de la base de données au lieu d'extraire des données dans Python pour les traiter. . Cela permet d'optimiser les requêtes et de réduire la charge de la base de données.

from django.db.models import Count, Max

# Count the number of posts for each status
status_count = Post.objects.values('status').annotate(count=Count('id'))

# Get the latest created post
latest_post = Post.objects.aggregate(latest=Max('created_at'))

Gestionnaires personnalisés ajoutons des méthodes de gestionnaire supplémentaires ou modifions le QuerySet que le gestionnaire renvoie initialement.

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='published')

class Post(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    status = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

    objects = models.Manager()  # Default manager
    published = PublishedManager()  # Custom manager for published posts

# Use the custom manager to get published posts
published_posts = Post.published.all()

ContentType est un modèle utile pour créer des relations génériques entre modèles sans les spécifier avec des clés étrangères directes. Les cas d'utilisation courants incluent des commentaires ou des balises qui doivent être attachés à différents types de modèles.

from django.contrib.contenttypes.models import ContentType

# Example model for comments
class Comment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    text = models.TextField()

# Creating a comment for a Post instance
post = Post.objects.get(id=1)
comment = Comment.objects.create(
    content_type=ContentType.objects.get_for_model(Post),
    object_id=post.id,
    text='Great post!'
)
Les

Transactions regroupent les opérations de base de données en une seule unité garantissant la cohérence des données. Nous pouvons utiliser le décorateur @transaction.atomic ou le gestionnaire de contexte transaction.atomic() pour envelopper le code dans un bloc de transaction.

from django.db import transaction

# Using a transaction block
with transaction.atomic():
    post = Post.objects.create(title='New Post', content='Content here...', status='published')
    # Any other database operations will be part of this transaction

Django permet d'exécuter des requêtes SQL brutes pour des requêtes complexes où vous avez besoin de flexibilité. Cependant, il doit être utilisé avec prudence.

from django.db import connection

def get_published_posts():
    with connection.cursor() as cursor:
        cursor.execute("SELECT * FROM blog_post WHERE status = %s", ['published'])
        rows = cursor.fetchall()
    return rows

Conclusion

L'ORM de Django simplifie les interactions avec les bases de données en fournissant une API de haut niveau pour travailler avec des modèles, des gestionnaires et des requêtes. Comprendre et utiliser ces fonctionnalités peut considérablement améliorer votre productivité et les performances de vos applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Guide du débutant de Rimworld: Odyssey
1 Il y a quelques mois By Jack chen
Porce de variable PHP expliquée
4 Il y a quelques semaines By 百草
Conseils pour écrire des commentaires PHP
3 Il y a quelques semaines By 百草
Commentant le code en php
3 Il y a quelques semaines By 百草

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1509
276
Une classe Python peut-elle avoir plusieurs constructeurs? Une classe Python peut-elle avoir plusieurs constructeurs? Jul 15, 2025 am 02:54 AM

Oui, apythonclasscanhavemultipleconstructorshroughalterativetechniques.1.UseaultArgumentsInthe__Init__MethodtoallowflexibleInitializationwithVaryingNumbersofParameters.2.DefineclassMethodsAnterveConstructorForCeleArandScalableableBjectCraturé

Python pour la gamme de boucle Python pour la gamme de boucle Jul 14, 2025 am 02:47 AM

Dans Python, l'utilisation d'une boucle pour la fonction avec la plage () est un moyen courant de contrôler le nombre de boucles. 1. Utilisez lorsque vous connaissez le nombre de boucles ou avez besoin d'accès aux éléments par index; 2. Plage (arrêt) de 0 à l'arrêt-1, plage (démarrage, arrêt) du début à l'arrêt-1, plage (démarrage, arrêt) ajoute la taille de l'étape; 3. Notez que la plage ne contient pas la valeur finale et renvoie des objets itérables au lieu de listes dans Python 3; 4. Vous pouvez vous convertir en liste via la liste (plage ()) et utiliser la taille de pas négative dans l'ordre inverse.

Python pour l'apprentissage automatique quantique Python pour l'apprentissage automatique quantique Jul 21, 2025 am 02:48 AM

Pour commencer avec Quantum Machine Learning (QML), l'outil préféré est Python et des bibliothèques telles que Pennylane, Qiskit, Tensorflowquantum ou Pytorchquantum doivent être installées; Familiarisez-vous ensuite avec le processus en exécutant des exemples, tels que l'utilisation de Pennylane pour construire un réseau neuronal quantique; Ensuite, implémentez le modèle en fonction des étapes de la préparation des ensembles de données, du codage des données, de la construction de circuits quantiques paramétriques, de la formation Classic Optimizer, etc.; Dans le combat réel, vous devez éviter de poursuivre des modèles complexes depuis le début, en faisant attention aux limitations matérielles, en adoptant des structures de modèles hybrides et en se référant continuellement aux derniers documents et documents officiels à suivre le développement.

Accéder aux données à partir d'une API Web dans Python Accéder aux données à partir d'une API Web dans Python Jul 16, 2025 am 04:52 AM

La clé de l'utilisation de Python pour appeler WebAPI pour obtenir des données est de maîtriser les processus de base et les outils communs. 1. L'utilisation des demandes pour lancer des demandes HTTP est le moyen le plus direct. Utilisez la méthode GET pour obtenir la réponse et utilisez JSON () pour analyser les données; 2. Pour les API qui nécessitent une authentification, vous pouvez ajouter des jetons ou des clés via des en-têtes; 3. Vous devez vérifier le code d'état de réponse, il est recommandé d'utiliser Response.RAISE_FOR_STATUS () pour gérer automatiquement les exceptions; 4. Face à l'interface de pagination, vous pouvez demander différentes pages et ajouter des retards pour éviter les limitations de fréquence; 5. Lors du traitement des données JSON renvoyées, vous devez extraire des informations en fonction de la structure et les données complexes peuvent être converties en données

python une ligne si d'autre python une ligne si d'autre Jul 15, 2025 am 01:38 AM

Python's Onelineifelse est un opérateur ternaire, écrit comme XifConditionelSey, qui est utilisé pour simplifier le jugement conditionnel simple. Il peut être utilisé pour une affectation variable, tel que status = "adulte" ifage> = 18Else "mineur"; Il peut également être utilisé pour renvoyer directement les résultats dans des fonctions, telles que Deget_Status (âge): renvoyer "adulte" ifage> = 18else "mineur"; Bien que l'utilisation imbriquée soit prise en charge, comme le résultat = "A" i

Blockbuster Python terminé Affichage de l'entrée Python Collection de site Web fini gratuit Blockbuster Python terminé Affichage de l'entrée Python Collection de site Web fini gratuit Jul 23, 2025 pm 12:36 PM

Cet article a sélectionné plusieurs sites Web de projet "finis" Python et des portails de ressources d'apprentissage "Blockbuster" de haut niveau pour vous. Que vous recherchiez l'inspiration de développement, l'observation et l'apprentissage du code source au niveau de la maîtrise ou que vous amélioriez systématiquement vos capacités pratiques, ces plateformes ne sont pas manquées et peuvent vous aider à devenir un maître Python rapidement.

Python If Else Exemple Python If Else Exemple Jul 15, 2025 am 02:55 AM

La clé pour rédiger les instructions IFELSE de Python est de comprendre la structure et les détails logiques. 1. L'infrastructure consiste à exécuter un morceau de code si des conditions sont établies, sinon la pièce ELSE est exécutée, ELLS est facultatif; 2. Le jugement multi-conditions est mis en œuvre avec ELIF, et il est exécuté séquentiellement et arrêté une fois qu'il est atteint; 3. Nested Si c'est utilisé pour un jugement supplémentaire de subdivision, il est recommandé de ne pas dépasser deux couches; 4. Une expression ternaire peut être utilisée pour remplacer Ifelse simple dans un scénario simple. Ce n'est qu'en faisant attention à l'indentation, à l'ordre conditionnel et à l'intégrité logique que nous pouvons écrire des codes de jugement clair et stable.

Python pour Loop pour lire la file ligne par ligne Python pour Loop pour lire la file ligne par ligne Jul 14, 2025 am 02:47 AM

L'utilisation d'une boucle pour lire les fichiers ligne par ligne est un moyen efficace de traiter les fichiers volumineux. 1. L'utilisation de base consiste à ouvrir le fichier via Openn () et à gérer automatiquement la fermeture. Combiné avec ForLineInfile pour traverser chaque ligne. line.strip () peut supprimer les ruptures de ligne et les espaces; 2. Si vous avez besoin d'enregistrer le numéro de ligne, vous pouvez utiliser l'énumération (fichier, start = 1) pour permettre au numéro de ligne de démarrer à partir de 1; 3. Lors du traitement des fichiers non ASCII, vous devez spécifier des paramètres d'encodage tels que UTF-8 pour éviter les erreurs de codage. Ces méthodes sont concises et pratiques, et conviennent à la plupart des scénarios de traitement de texte.

See all articles