簡體   English   中英

django orm 中objects.create() 和object.save() 的區別

[英]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()之間的區別總結如下。


  1. .save()在內部作為對 db 的INSERTUPDATE對象執行,而.objects.create()僅對 db 執行INSERT對象。

    Model.save()執行....

    UPDATE → 如果對象的主鍵屬性設置為計算結果為True的值

    INSERT → 如果對象的主鍵屬性未設置或 UPDATE 未更新任何內容(例如,如果主鍵設置為數據庫中不存在的值)。


  1. 如果主鍵屬性設置為一個值,則Model.save()執行UPDATEModel.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


  1. Model.objects.create()不等同於Model.save()但是同樣可以用force_insert=True參數在save方法上實現,即Model.save(force_insert=True)

  1. 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

可以通過以下鏈接了解更多詳細信息:

  1. https://docs.djangoproject.com/en/stable/ref/models/querysets/#create

  2. https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440

注意:以上答案來自問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM