3 ответов:
https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects
чтобы создать и сохранить объект за один шаг, используйте
create()метод.
обновление 15.3.2017:
Я открыл Django-вопрос по этому поводу, и он, кажется, предварительно принят здесь: https://code.djangoproject.com/ticket/27825
мой опыт заключается в том, что при использовании
Constructor(ORMкласс) по ссылкам с Django1.10.5в данных могут быть некоторые несоответствия (т. е. атрибуты созданного объекта могут получить тип входных данных вместо приведенного типа объекта ORM свойство) пример:
modelsclass Payment(models.Model): amount_cash = models.DecimalField()
some_test.py-object.createClass 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
два синтаксиса не эквивалентны, и это может привести к неожиданным ошибкам. Вот простой пример, показывающий различия. Если у вас есть модель:
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")
Comments