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


267

두 명령을 실행하는 것의 차이점은 무엇입니까?

foo = FooModel()

bar = BarModel.objects.create()

두 번째 BarModel는 데이터베이스에 즉시 a 를 작성하는 반면,에 대해 데이터베이스 에 추가 FooModel하려면 save()메소드를 명시 적으로 호출해야합니까?


47
네, 그 차이입니다.
Daniel Roseman

답변:


247

https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects

단일 단계에서 객체를 생성하고 저장하려면이 create()방법을 사용하십시오 .


3
장고 문서는이 시점에서 약간 모순적입니다. 같은 질문을했고 "모델을 인스턴스화해도 데이터베이스에 전혀 영향을주지 않습니다.이를 위해서는 save ()가 필요합니다." docs.djangoproject.com/ko/1.10/ref/models/instances/…
Nils

6
나는 모순되는 것으로 보지 않습니다. 일반적으로 파이썬에서는 create 메소드가 아닌 Objects 이름 뒤에 대괄호를 넣어서 객체를 인스턴스화합니다.
danidee

3
@danidee 나는 그것이 모순이 아니라는 데 동의하지만 확실히 오도합니다. 주로 Nils의 링크에서 example1은 "instantiating"이지만 example2는 "instantiating + saving"입니다. 또한 모델 저장 방법을 알고 싶을 때 왜 "쿼리"문서를 참조해야합니까? 장고 문서에는 정말 많은 고통이 있습니다.
Nakamura

3
INSERT가 쿼리이기 때문에 @Nakamura?
Juanjo Conti

16

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

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

그래서 .create()필수 필드가 (경우에도 객체 생성 null=False)없는가? 프로젝트에 테스트를 추가하고 create예기치 않은 결과가 발생합니다
Vaibhav Vishal

아니요, 장고에서는 일부 필드 유형이 약간 이상하게 작동하지만. 예를 들어, CharField설정되어 null=False있지 않으면 오류가 발생하지 않습니다. 장고는 기본적으로 빈 문자열로 문자열을 설정하여 ""기술적으로는 그렇지 않기 때문입니다.null
Thomas Leonard

예, char 필드와 field 필드 (기본적으로 char 필드이기도합니다)에만 문제가 있습니다. 사용 obj = MyModel()후, obj.full_clean()지금.
Vaibhav Vishal

10

업데이트 15.3.2017 :

나는 이것에 대해 장고 이슈를 열었고 여기에서 예비 적으로 받아 들여지는 것 같습니다 : https://code.djangoproject.com/ticket/27825

내 경험은 Django와 함께 참조로 Constructor( ORM) 클래스 를 사용할 때 1.10.5데이터에 약간의 불일치가있을 수 있습니다 (즉, 작성된 객체의 속성이 캐스트 된 유형의 ORM 객체 속성 대신 입력 데이터의 유형을 얻을 수 있음) 예제 :

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

Josh Smeaton은 캐스트 유형에 대한 개발자의 책임과 관련 하여 훌륭한 답변 을 제공했습니다. 답변을 업데이트하십시오.
Artur Barseghyan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.