2016-04-20 5 views
-1

Я изучаю Django и новичок в нем. Итак, лучший способ получить базу данных - через Manager.raw() или через Django ORM. Я знаю SQL в некоторой степени., который является хорошей практикой: Выполнение пользовательских SQL напрямую или ORM в Django

Каковы преимущества и недостатки использования SQL вместо ORM?

+0

Почему вы думаете, что разработчики Django дошли до такой длины, чтобы построить ORM, если они не хотели, чтобы вы его использовали? –

ответ

0

ORM если возможно, SQL если нет. От Django documentation:

Когда API-интерфейсы запроса модели не пройдут достаточно далеко, вы можете вернуться к написанию исходного SQL.

3

Как @Selcuk цитирует:

Когда API, модель запроса не идут достаточно далеко, вы можете упасть обратно к написанию сырой SQL.

Это означает, что вы должны использовать ОРМ, если вам абсолютно не нужно отступать. Поистине, вы можете пойти довольно далеко с ORM.

Некоторые быстрые базовые преимущества;

  • В результате получается более чистый код.
  • При работе с объектами вы получаете преимущества методов объектов и методов, которые вы создаете.
  • Легкая выборка относительных объектов.

В качестве примера, скажем, у вас есть users и comments

Это может выглядеть следующим образом:

class User(models.Model): 
    name = models.CharField(max_length=150) 
    email = models.EmailField() 


class Comment(models.Model): 
    author = models.ForeignKey(User) 
    text = models.TextField() 
    created_at = models.DateTimeField(auto_now_add=True) 

Давайте захватить, что последний пользователь, который подписался:

user = User.objects.last()

Ничего себе, это было легко. Теперь давайте рассмотрим все их комментарии:

user.comment_set.all() 

Серьезно, вы все еще хотите написать SQL?

Давайте захватить все наши новые комментарии со вчерашнего дня:

comments = Comment.objects.filter(created_at__gte='2016-04-18') 

Ой, подождите, вы хотите комментариев со вчерашнего дня на определенный адрес электронной почты? Ну, диспетчер объектов модели возвращает запрос, мы можем связать этих ребят в течение всего дня, и он не будет оцениваться (фактически попадает в базу данных), пока мы не попытаемся что-либо с ним сделать. Они лениво оценивали

user_comments = comments.filter(author__email='[email protected]') 

Это Dunder (двойное подчеркивание) может означать несколько вещей. В этом случае мы фильтруем по моделью author, которая является отношением внешнего ключа к модели User, и dunder позволяет нам указать поле для сравнения.

Выше, Dunder использовался для указания оператора сравнения, __gte, который «больше или равно»

Надеюсь, вы начинаете видеть, почему ОРМ полезно, и они просто поцарапать поверхность и обработка объектов выбора!

+0

спасибо Тиму, это действительно полезно – shankar

Смежные вопросы