É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