2016-10-06 1 views
0

я не могу найти ответ, будет ли это быстрее использовать:Есть ли причина использовать «if not ***. Filter(). Exists(): ***. Create()» вместо «***. Get_or_create()»?

if not Model.objects.filter(*some_data*).exists(): 
    Model.objects.create(*some_data*) 

затем:

Model.objects.get_or_create(*some_data*) 

Кто-нибудь знает?

+0

так как это было? – e4c5

+0

@ e4c5 К сожалению, у меня нет ответа – TitanFighter

ответ

1

get_or_create Ну это

Метод удобства для поиска объекта с заданными kwargs (может быть пустым, если ваша модель имеет значения по умолчанию для всех полей), создавая один при необходимости.

Так что, по крайней мере, вы нарушаете принцип СУХОЙ. Исходя из этого, вы проверяете все поля в модели, а не только первичный ключ или уникальное поле. Вы пытаетесь найти объект, где все поля совпадают. Таким образом, шансы очень высоки, что вы получите ложные результаты, и ваш оператор создания завершится неудачно. Вот почему get_or_create имеет параметр defaults

+0

Призывает ли он команду 'UPSERT' sql при наличии (например, при использовании postgresql)? https://wiki.postgresql.org/wiki/UPSERT –

+0

Нет, это не AFAIK – e4c5