Je veux créer un objet modèle, comme Person, si l'identifiant de la personne n'existe pas, ou j'obtiendrai cet objet de personne.
Le code pour créer une nouvelle personne comme suit:
class Person(models.Model):
identifier = models.CharField(max_length = 10)
name = models.CharField(max_length = 20)
objects = PersonManager()
class PersonManager(models.Manager):
def create_person(self, identifier):
person = self.create(identifier = identifier)
return person
Mais je ne sais pas où vérifier et obtenir l'objet Personne existant.
python
django
django-models
user1687717
la source
la source
QuerySet
aupdate_or_create
On ne sait pas si votre question demande la méthode get_or_create (disponible au moins à partir de Django 1.3) ou la méthode update_or_create (nouveau dans Django 1.7). Cela dépend de la manière dont vous souhaitez mettre à jour l'objet utilisateur.
L'utilisation de l'échantillon est la suivante:
la source
update_or_create
car pour ce cas d'utilisation, il vaut mieux que deget_or_create
simplement appelersave()
à nouveau l'objet.Person.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
defaults
argument de ces fonctions est l'endroit où vous spécifiez les champs que vous souhaitez ajouter au modèle. Cela n'a rien à voir avec les valeurs par défaut spécifiées sur les champs de votre modèleDjango prend en charge cela, vérifiez get_or_create
la source
Pour seulement une petite quantité d'objets, update_or_create fonctionne bien, mais si vous le faites sur une grande collection, il ne sera pas bien mis à l'échelle. update_or_create exécute toujours d'abord un SELECT puis un UPDATE.
Cela n'exécutera au mieux que la première requête de mise à jour, et uniquement si elle ne correspondait à aucune ligne, exécutera une autre requête INSERT. Ce qui augmentera considérablement vos performances si vous vous attendez à ce que la plupart des lignes soient réellement existantes.
Tout dépend de votre cas d'utilisation. Si vous attendez principalement des insertions, la commande bulk_create () pourrait être une option.
la source
J'ai pensé que j'ajouterais une réponse car le titre de votre question semble demander comment créer ou mettre à jour, plutôt que d'obtenir ou de créer comme décrit dans le corps de la question.
Si vous vouliez créer ou mettre à jour un objet, la méthode .save () a déjà ce comportement par défaut, à partir de la documentation :
Il convient de noter que lorsqu'ils disent «si la mise à jour n'a rien mis à jour», ils se réfèrent essentiellement au cas où l'id que vous avez donné à l'objet n'existe pas déjà dans la base de données.
la source
Si l'une des entrées lors de la création est une clé primaire, cela suffira:
Il sera automatiquement mis à jour s'il existe car deux données avec la même clé primaire ne sont pas autorisées.
la source