programing

장고 모델() 대 Model.objects.create()

bestcode 2022. 9. 21. 00:09
반응형

장고 모델() 대 Model.objects.create()

2개의 명령어를 실행하는 경우의 차이점:

foo = FooModel()

그리고.

bar = BarModel.objects.create()

두 번째 것은 즉시 생성됩니까?BarModel데이터베이스 내, 동안FooModel,그save()데이터베이스에 추가하려면 메서드를 명시적으로 호출해야 합니까?

https://docs.djangoproject.com/en/stable/topics/db/queries/ #작성-실행

개체를 한 번에 만들고 저장하려면create()방법.

의 차이점Model()그리고.Model.objects.create()다음과 같습니다.


  1. 삽입과 갱신

    Model.save()는 DB 내의 오브젝트를 삽입 또는 갱신합니다.Model.objects.create()는 삽입만 합니다.

    Model.save()한다

    • UPDATE 객체의 기본 키 속성이 다음과 같이 평가되는 값으로 설정되어 있는 경우True

    • INSERT 객체의 프라이머리 키 속성이 설정되어 있지 않거나 UPDATE가 아무것도 업데이트하지 않은 경우(프라이머리 키가 데이터베이스에 존재하지 않는 값으로 설정되어 있는 경우 등).


  1. 기존 기본 키

    프라이머리 키 속성이 값으로 설정되어 있고 이러한 프라이머리 키가 이미 존재하는 경우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. 다음을 사용하여 DB 삽입/업데이트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. 다음을 사용하여 DB에 삽입Model.objects.create()

      Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100)
      IntegrityError: UNIQUE constraint failed: m****t.subject_id
      

    설명:이 예에서는math.save()UPDATE(변경)name물리부터 수학까지max_marks100 ~ 50)의 이유subject_id프라이머리 키와subject_id=1DB에 이미 존재합니다.그렇지만Subject.objects.create()올리다IntegrityError, 다시 프라이머리 키이기 때문에subject_id가치가 있는1는 이미 존재합니다.


  1. 강제 삽입

    Model.save()처럼 행동하게 할 수 있다Model.objects.create()을 사용하여force_insert=True파라미터:Model.save(force_insert=True).


  1. 반환값

    Model.save()돌아가다None어디에Model.objects.create()모델 인스턴스를 반환합니다. package_name.models.Model


결론: Model.objects.create()모델 초기화 및 수행save()와 함께force_insert=True.

소스코드에서 발췌한 것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/ #작성

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

두 구문이 동일하지 않아 예기치 않은 오류가 발생할 수 있습니다.다음은 차이점을 보여주는 간단한 예입니다.모델이 있는 경우:

from django.db import models

class Test(models.Model):

    added = models.DateTimeField(auto_now_add=True)

첫 번째 개체를 만듭니다.

foo = Test.objects.create(pk=1)

그런 다음 동일한 기본 키를 사용하여 개체를 생성하려고 합니다.

foo_duplicate = Test.objects.create(pk=1)
# returns the error:
# django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")

foo_duplicate = Test(pk=1).save()
# returns the error:
# django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")

업데이트 15.3.2017:

저는 이것에 관한 장고호를 개설했습니다.여기서 사전접수를 받고 있는 것 같습니다.https://code.djangoproject.com/ticket/27825

으로는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Constructor )ORM 참조에 클래스 ( 참조)1.10.5 수 입력 할 수 ).예: "이다"(", "M") §:

models

class Payment(models.Model):
     amount_cash = models.DecimalField()

some_test.py-object.create

Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor.objects.create(**actual_data)
            print(type(_obj.amount_cash)) # Decimal
            assert created
           objs.append(_obj)
        return objs

some_test.py-Constructor()

Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor(**actual_data)
            print(type(_obj.amount_cash)) # Float
            assert created
           objs.append(_obj)
        return objs

Model.objects.create()이치노 Model()는 메모리 모델인스턴스만 만듭니다.""를 되지 않습니다.save()저장 방법을 지정합니다.그 때 검증도 이루어집니다.

언급URL : https://stackoverflow.com/questions/26672077/django-model-vs-model-objects-create

반응형