Recommandé pour get_or_new

Étant donné que le statut de l'utilisateur est souvent géré à l'aide de RDB dans les services Web, nous voyons du code dans divers projets tels que la création d'enregistrements s'ils ne sont pas acquis au moment de l'acquisition.

Django a également une méthode standard appelée get_or_create qui récupère (SELECT) s'il y a un enregistrement dans la table et crée (INSERT) si ce n'est pas le cas.

Par exemple, si vous souhaitez afficher le solde de points pour chaque utilisateur sur le site du concours, la valeur par défaut est de 0 point s'il n'y a pas d'enregistrement d'utilisateur.

Sinon, le mouvement pour créer un enregistrement consiste à enregistrer ces informations de 0 point dans une table ** délibérément **.

** Dois-je enregistrer les valeurs par défaut? ** **

De plus, la création (INSERT) est un ** traitement de mise à jour **. Il est nécessaire de prendre en compte diverses choses telles que le contrôle exclusif et la double exécution lors de la mise à jour. Les verrous sont également créés par INSERT.

Cependant, il sera difficile d'écrire le processus car vous ne pouvez pas obtenir une instance du modèle avec juste get.

** Alors get_or_new **

Sinon, créez get_or_new qui crée uniquement l'instance et ne crée pas l'enregistrement. Cela vous permettra d'obtenir une instance sans aucun effet secondaire.

Le code ressemble à ceci

# models.py
from django.db import models


class User(models.Model):
    point = models.IntegerField('Points gagnés', default=0)
    
    @classmethod
    def get_or_new(cls, pk):
        try:
            return cls.objects.get(pk=pk)
        except cls.DoesNotExist:
            return cls(pk=pk)


# view.py
from django.views.generic import TemplateView
from .models import User


class IndexView(TemplateView):
    template_name = "index.html"
    def get(request, user_id):
        user = User.get_or_new(user_id)
        self.render_to_response({'user': user})


Cela prendra l'instance requise de User et, bien sûr, retournera 0 comme user.point. Il y a d'autres avantages

etc. Attention, ne mettez pas à jour en fonction des données obtenues à partir de get_or_new. Si vous le faites deux fois, les mauvaises données finiront par être écrites.

Cette fois, c'est une histoire de référence, donc j'écrirai une histoire de mise à jour la prochaine fois.

Recommended Posts

Recommandé pour get_or_new
Distribution Linux recommandée pour les débutants
Image de conteneur recommandée pour les applications Python
Site de compétition recommandé pour les data scientists
[Balisage recommandé pour l'apprentissage automatique # 4] Script d'apprentissage automatique ...?
Ordre d'étude recommandé pour les débutants en apprentissage automatique / apprentissage en profondeur