在Django中创建模型对象的最佳方法是什么?

时间:2015-07-25 07:26:19

标签: django django-models django-views

Author.objects.create(name="Joe")

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

这两者有什么区别? 哪一个更好?


类似的问题:
- difference between objects.create() and object.save() in django orm
- Django: Difference between save() and create() from transaction perspective

3 个答案:

答案 0 :(得分:5)

create()就像是save()方法的包装器。

  

创建(** kwargs)

     

创建对象并将其保存在一个对象中的便捷方法   步骤

create()函数的Django 1.8 source code

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

对于create(),在内部调用force_insert时会传递save()参数,这会强制save()方法执行SQL INSERT ,但未执行UPDATE。它会强行在数据库中插入一个新行。

save()UPDATEINSERT将会执行,具体取决于对象的主键属性值。

答案 1 :(得分:3)

Create只是用于使用kwargs创建新对象的便捷代理。如下所示,它会为您调用save()

来自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

要注意的一件事是要保存的force_insert参数。这意味着Django将始终在此使用INSERT sql语句而不是UPDATE。默认值为false,因此在第二个示例中,save()将INSERT或UPDATE。

答案 2 :(得分:2)

您使用Manager方法create的第一个方法。它已经为您实现,它将自动保存。

第二种方法是创建类Author的实例,然后调用save。

总之,

Author.objects.create(name="Joe")创建 - >保存()

另一条第一行创建,第二条线保存。

在某些情况下,您需要始终调用manager方法。例如,您需要哈希密码。

# 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")

所以基本上,在你的模型中将其视为制定者。如果要在创建时始终修改数据,请使用管理器。