2015-07-25 17 views
6
Author.objects.create(name="Joe") 

oQual è il modo migliore per creare un oggetto modello in Django?

an_author = Author(name="Joe") 
an_author.save() 

Qual è la differenza tra questi due? Quale è meglio?


domande simili:
- difference between objects.create() and object.save() in django orm
- Django: Difference between save() and create() from transaction perspective

+0

possibile duplicato di [Django: Differenza tra save() e create() dal punto di vista della transazione] (http://stackoverflow.com/questions/4206819/django-difference-between-save-and-create-from-transaction -prospettiva) – ozgur

risposta

1

Il primo si sta utilizzando il metodo createManager. È già implementato per te e verrà salvato automaticamente.

Il secondo metodo si sta creando un'istanza di classe Author quindi si sta chiamando save.

Quindi, in conclusione,

Author.objects.create(name="Joe") Crea -> save()

l'altro prima linea non creare, e seconda linea salvano.


in alcuni casi, è necessario chiamare il metodo gestore sempre. Ad esempio, è necessario hash la password.

# In here you are saving the un hashed password. 

user = User(username="John") 
user.password = "112233" 
user.save() 


# In here you are using the manager method, 
# which provide for you hashing before saving the password. 

user = User.objects.create_user(username="John", password="112233") 

Quindi, in fondo, nei vostri modelli pensateci come setter. Se si desidera modificare i dati sempre durante la creazione, utilizzare i gestori.

5

create() è come un wrapper sul metodo save().

creare (**) kwargs

Un metodo comodo per creare un oggetto e salvare tutto in un passo

Django 1.8 source code per create() funzione:

def create(self, **kwargs): 
     """ 
     Creates a new object with the given kwargs, saving it to the database 
     and returning the created object. 
     """ 
     obj = self.model(**kwargs) 
     self._for_write = True 
     obj.save(force_insert=True, using=self.db) # calls the `save()` method here 
     return obj 

Per create(), un parametro force_insert viene passato durante la chiamata save() internamente che costringe il metodo save() a eseguire uno SQL INSERT e non eseguire un UPDATE. Inserirà forzatamente una nuova riga nel database.

Per save(), sia un UPDATE o INSERT sarà effettuata seconda valore di attributo chiave primaria dell'oggetto.

3

Create è solo un proxy di convenienza per la creazione di un nuovo oggetto con kwargs.Come potete vedere qui sotto, si chiede save() per voi:

Da Django Source:

def create(self, **kwargs): 
     """ 
     Creates a new object with the given kwargs, saving it to the database 
     and returning the created object. 
     """ 
     obj = self.model(**kwargs) 
     self._for_write = True 
     obj.save(force_insert=True, using=self.db) 
     return obj 

Una cosa da notare è l'argomento force_insert per salvare. Ciò significa che Django utilizzerà sempre un'istruzione INSERT sql qui e non un UPDATE. L'impostazione predefinita è false, quindi nel secondo esempio save() verrà INSERT o UPDATE.

Problemi correlati