Outline
in this blog post, we’ll see what is ORM(Object-Relational Mapping) and how to use it to create, read, update, delete(CRUD - Create Read Update Delete) a data to the database.
this blog is a series. if you want to check other blog posts of the series, see the links below.
- django installation
- Start django Project
- Use Models in django
- django Administrator Page
- django Routing
- django ORM
- django View
- django Form
- Upload django project to Heroku
also, this blog series source code is opened on Github. you can see full source code via the link below.
What Is ORM?
ORM(Object-Relational Mapping)
means to Map(ping)
Object
and Relational database
. simply, to map the database table and object makes CRUD is possible without SQL query.
we’ve already prepared to use django ORM(Object-Relational Mapping) in the previous blog post(Use Models in django). in the previous blog post, we’ve been mapping the Post
Models to the database blog_post
table. we’ll use this Models to understand how to CRUD
with django ORM(Object-Relational Mapping).
execute the djanog command below to execute Shell that django basically provides.
# source venv/bin/activate
# cd django_exercise
python manage.py shell
import Post
Models to execute the code below.
>>> from blog.models import Post
Read Data
execute the code below to Read
all Post
data.
Post.objects.all()
after executing well, you can see the result like below.
>>> Post.objects.all()
<QuerySet [<Post: this is a test1 title>, <Post: this is a test2 title>]>
execute the code below to import User Models and store User data to a variable for later.
>>> from django.contrib.auth.models import User
>>> admin = User.objects.get(username='dev-yakuza')
Create Data
execute the code below to Create
a new Post
data.
Post.objects.create(author=admin, title='This is a test title from django shell', content='This is a test title from django shell. This is a test title from django shell.')
after it, you can see the result like below.
>>> Post.objects.create(author=admin, title='This is a test title from django shell', content='This is a test title from django shell. This is a test title from django shell.')
<Post: This is a test title from django shell>
Check Data Creation
execute the code below to check the data stored well in Post
Models.
>>> Post.objects.all()
<QuerySet [<Post: this is a test1 title>, <Post: this is a test2 title>, <Post: This is a test title from django shell>]>
open the new terminal and execute the django command below to start the test server. and then, when you see the administrator page, you can see the data stored well in the screen below.
# source venv/bin/activate
# cd django_exercise
python manage.py runserver
you can use database tools to check the data stored well.
Update Data
execute the code below to Read and Update
the data.
post = Post.objects.get(title='This is a test title from django shell')
post.title = 'This is a test title updated from django shell'
post.save()
execute the code below to check the data updated.
Post.objects.get(title__contains='updated')
# or
Post.objects.filter(title__contains='updated')
also, we can use the function we defined before in the Post
Models to update.
post = Post.objects.get(title__contains='updated')
# post.published_at
post.publish()
# >>> post.published_at
# datetime.datetime(2019, 5, 21, 13, 1, 58, 970677)
Delete Data
execute the code below to Delete
the data we created above.
post = Post.objects.get(title__contains='updated')
post.delete()
# >>> Post.objects.all()
# <QuerySet [<Post: this is a test1 title>, <Post: this is a test2 title>]>
Select(Read) Condition
so far, we saw how to CRUD(Create Read Update Delete)
to the database. below is about selection conditions to select(read) a data
- Selection(Read) Condition
Condition | Description | Usage |
---|---|---|
__contains | query data contains the condition text. | Post.objects.filter(title__contains=’test’) |
__icontains | query data contains the condition text without distinction of upper-lower case. | Post.objects.filter(title__icontains=’this’) |
__lt | query data less than(lt) condition value | Post.objects.filter(published_at__lt=timezone.now()) |
__lte | query data less than or equal(lte) condition value | Post.objects.filter(published_at__lt=timezone.now()) |
__gt | query data greater than(gt) condition value | Post.objects.filter(published_at__gt=timezone.now()) |
__gte | query data greater than or equal(gte) condition value | Post.objects.filter(published_at__gte=timezone.now()) |
__in | query data by condition value list. | Post.objects.filter(id__in=[1, 2, 3]) |
__year | query data by condition year | Post.objects.filter(created_at__year=’2019’) |
__year | query data by condition month | Post.objects.filter(created_at__month=’5’) |
__day | query data by condition day | Post.objects.filter(created_at__day=’21’) |
__isnull | query data by null condition | Post.objects.filter(published_at__isnull=True) |
__startswith | query data starting with condition text. | Post.objects.filter(title__startswith=’This’) |
__istartswith | query data starting with condition text without deistinction of upper-lower case | Post.objects.filter(title__istartswith=’this’) |
__endswith | query data ending with condition text. | Post.objects.filter(title__endswith=’title’) |
__iendswith | query data ending condition text without distinction of upper-lower case | Post.objects.filter(title__iendswith=’title’) |
__range | query data by condition range(= SQL between feature) | Post.objects.filter(id__range=(1, 10)) |
- Exclusion Condition: we can select the data with exclusion condition.
Post.objects.all().exclude(title__contains='This')
- Multiple Condition: we can select the data with multiple condition like below.
Post.objects.filter(title__contains='this', title__endswith='title')
Post.objects.filter(title__contains='this').filter(title__endswith='title')
from django.db.models import Q
Post.objects.filter(Q(title__contains='this') | Q(title__endswith='title'))
Post.objects.filter(Q(title__contains='this') & Q(title__endswith='title'))
- 조회 범위: 아래와 같이 가져올 데이터의 범위(limit)을 지정할 수 있다.
Post.objects.all().exclude(title__contains='This')[:1]
Ordering(Sorting)
we can order(sort) the data ascending or descending.
- Ascending: Post.objects.order_by(‘created_at’)
- Descending: Post.objects.order_by(‘-created_at’)
Exit Shell
so far, we exercised django ORM(Object-Relational Mapping) with django Shell. execute the code below to exit django Shell.
exit()
Completed
we saw what is ORM(Object-Relational Mapping) and how to use it on django. ORM(Object-Relational Mapping) is the concept used in many frameworks, so I think remembering it is good for us. anyway, now we can create, read update and delete(CRUD - Create Read Update Delete) the data with django Models!
Was my blog helpful? Please leave a comment at the bottom. it will be a great help to me!
App promotion
Deku
.Deku
created the applications with Flutter.If you have interested, please try to download them for free.