[PYTHON] Empfohlen für get_or_new

Da der Benutzerstatus häufig über RDB in Webdiensten verwaltet wird, wird Code in verschiedenen Projekten angezeigt, z. B. beim Erstellen von Datensätzen, wenn diese zum Zeitpunkt der Erfassung nicht erfasst wurden.

Django hat auch eine Standardmethode namens get_or_create, die abruft (SELECT), wenn sich ein Datensatz in der Tabelle befindet, und erstellt (INSERT), wenn dies nicht der Fall ist.

Wenn Sie beispielsweise die Punktebilanz für jeden Benutzer auf der Gewinnspielwebsite anzeigen möchten, beträgt der Standardwert 0 Punkte, wenn kein Benutzerdatensatz vorhanden ist.

Wenn nicht, müssen Sie zum Erstellen eines Datensatzes diese 0-Punkt-Informationen in einer ** absichtlich ** Tabelle speichern.

** Muss ich die Standardwerte speichern? ** **.

Außerdem ist die Erstellung (INSERT) ** Update-Verarbeitung **. Bei der Aktualisierung müssen verschiedene Aspekte wie die ausschließliche Kontrolle und die doppelte Ausführung berücksichtigt werden. Sperren werden auch von INSERT erstellt.

Es wird jedoch schwierig sein, den Prozess zu schreiben, da Sie mit nur get keine Instanz des Modells abrufen können.

** Also get_or_new **

Wenn nicht, erstellen Sie get_or_new, das nur die Instanz erstellt und den Datensatz nicht erstellt. Auf diese Weise erhalten Sie eine Instanz ohne Nebenwirkungen.

Der Code sieht so aus

# models.py
from django.db import models


class User(models.Model):
    point = models.IntegerField('Verdiente Punkte', 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})


Dies nimmt die erforderliche Instanz von User und gibt natürlich 0 als user.point zurück. Es gibt noch andere Vorteile

etc. Bitte beachten Sie, dass der Aktualisierungsvorgang nicht auf der Grundlage der von get_or_new erhaltenen Daten durchgeführt werden sollte. Wenn Sie es zweimal tun, werden möglicherweise die falschen Daten geschrieben.

Diesmal ist es eine Referenzgeschichte, also werde ich das nächste Mal eine Update-Geschichte schreiben.

Recommended Posts

Empfohlen für get_or_new
Empfohlene Linux-Distribution für Anfänger
Empfohlenes Container-Image für Python-Anwendungen
Empfohlene Wettbewerbsseite für Datenwissenschaftler
[Empfohlenes Tagging für maschinelles Lernen # 4] Skript für maschinelles Lernen ...?
Empfohlene Studienreihenfolge für Anfänger des maschinellen Lernens / Deep Learning