Python/๐Ÿฆ• Django

Django์—์„œ get() ๊ณผ filter() ๋Š” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘ ๋ฉ”์„œ๋“œ๊ฐ„์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. get() method ์ด ๋ฉ”์„œ๋“œ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ์ฒด๊ฐ€ ์—†๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ DoesNotExist ๋˜๋Š” MultipleObjectsReturned ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. get() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ• ๋•Œ๋Š” try: except ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค. try: obj = MyModel.objects.get(name='example') # ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์Œ except MyModel.DoesNotExist: # ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์Œ excep..
DRF๋กœ ์ž‘์„ฑํ•œ API์— POST Request๋ฅผ ๋ณด๋ƒˆ์„ ์‹œ View์™€ Serializer์—์„œ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ํ˜๋Ÿฌ๊ฐ€๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ์„ฑ๋˜๋Š”์ง€ ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. # snippets/models.py from django.db import models from pygments.lexers import get_all_lexers from pygments.styles import get_all_styles LEXERS = [item for item in get_all_lexers() if item[1]] LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) STYLE_CHOICES = sorted([(item, item) fo..
๐Ÿ“์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ์ถ•์•ฝ์ ์ด๊ฑฐ๋‚˜ ํ•จ์ถ•์ ์ธ ๋ณ€์ˆ˜๋ช…์€ ํ”ผํ•œ๋‹ค. # bad bal_s_d # good balance_sheet_decrease ์งง๊ฒŒ ์”€์œผ๋กœ์จ ๋ช‡ ์ดˆ ์ •๋„ ํƒ€์ž ์‹œ๊ฐ„์€ ์•„๋‚„ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ฒฐ๊ตญ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์€ ๋ช‡ ์‹œ๊ฐ„ ๋˜๋Š” ๋ฉฐ์น ์„ ํ—ˆ๋น„ํ•˜๊ฒŒ ๋˜๋Š” ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋กœ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋‹ค๊ฐ€์˜ฌ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ๋ฏธ๋ฆฌ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํƒ€์ž์น˜๋Š” ๋ฐ ๋ช‡ ์ดˆ ์ •๋„ ์‹œ๊ฐ„์„ ๋” ์จ์„œ ๋ณ€์ˆ˜๋ช…์„ ๊ธธ๊ฒŒ ํ’€์–ด ์“ฐ๋Š” ํŽธ์ด ์ถฉ๋ถ„ํžˆ ๊ฐ€์น˜ ์žˆ๋Š” ์ผ์ผ ๊ฒƒ์ด๋‹ค. ํ•จ์ˆ˜ ์ธ์ž์˜ ์ด๋ฆ„๋“ค์€ ๊ผญ ์จ์ค€๋‹ค. ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌธ์„œํ™”ํ•œ๋‹ค. ์ฝ”๋“œ์— ์ฃผ์„์€ ๊ผญ ๋‹ฌ๋„๋ก ํ•œ๋‹ค. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋“ค์€ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•ด๋‘”๋‹ค. ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์€ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์–ด๋ฆผ์žก์•„ ์Šคํฌ๋กค ์—†์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธธ..
Django Management Command๋Š” python manage.py shell, python manage.py migrate ์™€ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ์žฅ๊ณ ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋งํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด Django Command๋ฅผ Customํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ์›ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์ปค์Šคํ…€ํ•˜์—ฌ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. custom command ๋งŒ๋“ค๊ธฐ ์›ํ•˜๋Š” app ํด๋” ๋ฐ‘์— management ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฐ‘์— commands ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค. ์•ฑ์ด๋ฆ„/management/commands์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ํด๋”๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด commands ํด๋” ๋ฐ‘์— ์›ํ•˜๋Š” ๋ช…๋ น์–ด ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ๋งŒ์•ฝ python manage.py insert_data_to_db ๋ผ๋Š” ์ปค์Šคํ…€ command๋ฅผ ๋งŒ๋“ค๊ณ  ..
JWT๋กœ ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„ํ•˜๊ธฐ jwt ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐ€๊ณ„๋ถ€ ์„œ๋น„์Šค์—์„œ jwt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ jwt ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๋ ค๋‹ˆ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋ ค ํ•œ๋‹ค. JWT ๋กœ๊ทธ์ธ JWT ํ† ํฐ์˜ ์ž‘๋™๋ฐฉ์‹์€ ์ด๋ ‡๋‹ค. ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค. db์—์„œ ์œ ์ €์ •๋ณด๋ฅผ ์กฐํšŒํ•œ ๋’ค ์œ ์ €์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋กœ๊ทธ์ธ๊ณผ ๋™์‹œ์— JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ api ์š”์ฒญ์„ ํ•  ๋•Œ ํ† ํฐ์„ Authorization header์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„๋Š” ํ† ํฐ์„ decodeํ•˜์—ฌ ์œ ์ € ์ •๋ณด๋ฅผ ํš๋“ํ•œ๋‹ค. db์— ํ† ํฐ์—์„œ ์–ป์€ ์œ ์ € ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋Š” ์œ ์ €๊ฐ€ ์—†์„ ์‹œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์œ ์ €๊ฐ€ ์กด์žฌํ•  ์‹œ api ์š”์ฒญ์˜ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ..
๐Ÿ’ค ORM์€ ๊ฒŒ์œผ๋ฅด๋‹ค (Lazy Loading) # models.py from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete..
Django ORM์ด๋ž€? Django ORM์ด๋ž€ Object Relational Mapping์˜ ์ค„์ž„๋ง์ด๋ฉฐ ๊ฐ์ฒด(Object)์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Relational)์„ ์—ฐ๊ฒฐ(Mapping) ํ•ด์ค€๋‹ค๋Š” ๋œป์ด๋‹ค. ์œ„์˜ ๋ง๋งŒ ๋“ค์–ด์„œ๋Š” Django ORM์ด๋ผ๋Š” ๊ฒƒ์ด ์ž˜ ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. ์กฐ๊ธˆ ํ’€์–ด์„œ ์„ค๋ช…ํ•œ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›๋ž˜ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Django ORM์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฟผ๋ฆฌ๋ฌธ ์—†์ด ํŒŒ์ด์ฌ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. from django.db import models class User(models.Model): name = models.CharField(max_length=45) email = model..
rimchoi
'Python/๐Ÿฆ• Django' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก