[英]difference between objects.create() and object.save() in django orm
u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()
UserDetails.objects.create()
和u.save()
都執行相同的save()
函數。 有什么不同? 使用create()
與save()
有什么額外的檢查或好處嗎?
類似問題:
Django 文檔說它是一樣的。 在一行上制作它更方便。 您也可以在一行上創建一個save()
,但它會更冗長且可讀性更低——很明顯,您正在使用create()
方法創建一個新對象。
create(**kwargs)
一種創建對象並將其全部保存在一個步驟中的便捷方法。 因此:
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
和:
p = Person(first_name="Bruce", last_name="Springsteen") p.save(force_insert=True)
是等價的。
force_insert
參數在別處有文檔說明,但這意味着總是會創建一個新對象。 通常你不需要擔心這個。 但是,如果您的模型包含您設置的手動主鍵值,並且該值已存在於數據庫中,則對create()
的調用將失敗並顯示IntegrityError
因為主鍵必須是唯一的。 如果您使用手動主鍵,請准備好處理異常。
類似問題: Django Model() vs Model.objects.create()
Model()
與Model.objects.create()
之間的區別總結如下。
.save()
在內部作為對 db 的INSERT或UPDATE對象執行,而.objects.create()
僅對 db 執行INSERT對象。
Model.save()
執行....
UPDATE → 如果對象的主鍵屬性設置為計算結果為True
的值
INSERT → 如果對象的主鍵屬性未設置或 UPDATE 未更新任何內容(例如,如果主鍵設置為數據庫中不存在的值)。
如果主鍵屬性設置為一個值,則Model.save()
執行UPDATE但Model.objects.create
引發IntegrityError
。
例如。
模型.py
class Subject(models.Model): subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id') name = models.CharField(max_length=255) max_marks = models.PositiveIntegerField()
1) 使用Model.save()
插入/更新到數據庫
physics = Subject(subject_id=1, name='Physics', max_marks=100) physics.save() math = Subject(subject_id=1, name='Math', max_marks=50) # Case of update math.save()
輸出:
Subject.objects.all().values() <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
2) 使用Model.objects.create()
插入數據庫
Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100) IntegrityError: UNIQUE constraint failed: m****t.subject_id
說明:上面的math.save()
是更新的情況,因為subject_id
是主鍵並且subject_id=1
存在 django 在內部執行UPDATE ,為此將 Physics 命名為 Math 和 max_marks 從 100 到 50 ,但是objects.create() raise IntegrityError
Model.objects.create()
不等同於Model.save()
但是同樣可以用force_insert=True
參數在save
方法上實現,即Model.save(force_insert=True)
。Model.save()
return None
where Model.objects.create()
返回模型實例,即package_name.models.Model
結論: Model.objects.create()
內部進行模型初始化並使用force_insert=True
執行save
。
Model.objects.create() 的源代碼塊
def create(self, **kwargs):
"""
Create 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
可以通過以下鏈接了解更多詳細信息:
注意:以上答案來自問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.