[django] tutorial - 1,2

ใ…Žใ…Žยท2021๋…„ 6์›” 15์ผ
0

django

๋ชฉ๋ก ๋ณด๊ธฐ
2/8


๐Ÿ“Œ django tutorials


- part 1

#๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ 
conda create -n "๊ฐ€์ƒํ™˜๊ฒฝ์ด๋ฆ„" python=3.7
#๊ฐ€์ƒํ™˜๊ฒฝ ๋ฆฌ์ŠคํŠธ ํ™•์ธ
conda env list
# ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”ํ•˜๊ธฐ 
conda activate "๊ฐ€์ƒํ™˜๊ฒฝ์ด๋ฆ„"
# ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ 
conda deactivate

#๊ฐ€์ƒํ™˜๊ฒฝ ์‚ญ์ œํ•˜๊ธฐ
conda env remove -n "๊ฐ€์ƒํ™˜๊ฒฝ์ด๋ฆ„"
# ์žฅ๊ณ  ์„ค์น˜ ํ™•์ธ
python -m django version
#mysite๋ผ๋Š” ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ 
django-admin startproject mysite
#์„œ๋ฒ„ ๋Œ๋ฆฌ๊ธฐ (mysite ์œ„์น˜์—์„œ ์‹คํ–‰)
python manage.py runserver
#์•ฑ ๋งŒ๋“ค๊ธฐ 
python manage.py startapp polls
  • ์•ฑ์€ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์˜ ๊ฐœ๋ณ„์ ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ์ฆ‰ ํ”„๋กœ์ ํŠธ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ๊ธฐ๋Šฅ๋“ค์„ ๋งํ•œ๋‹ค. ex) polls, ์–ด์ฉŒ๊ตฌ , ์–ด์ฉŒ๊ตฌ
  • ์•ฑ(polls)์˜ ์ฒ˜์Œ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๊ตฌ์กฐ
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

๋ทฐ ์ž‘์„ฑํ•˜๊ธฐ

#polls/views.py
from django.http import HttpResponse


#๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ view
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

โžก๏ธ view๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ด์™€ ์—ฐ๊ฒฐ๋œ url์ด ํ•„์š”ํ•œ๋Œ€ ์ด๋•Œ URLconf๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. polls์— URLconf๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด polls์•ˆ์— urls.py ๋งŒ๋“ ๋‹ค.

#mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

โžก๏ธ ๊ทธ๋ฆฌ๊ณ  ์ตœ์ƒ์œ„ URLconfig์—์„œ polls.urls๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ mysite/urls.py urlpatterns์— include() ํ•จ์ˆ˜๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค.

python manage.py runserver

โžก๏ธ url์ด ์ž˜ ์—ฐ๊ฒฐ๋๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์‹คํ–‰

path์ธ์ˆ˜


- part 2

#๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‹คํ–‰
python manage.py migrate
from django.db import models
#polls/models.py


# ๋‘ ๊ฐ€์ง€ ํ•„๋“œ๋ฅผ ๋งŒ๋“ฌ - Question(์งˆ๋ฌธ ๋‚ด์šฉ,๋ฐœํ–‰์ผ)๊ณผ Choice(์„ ํƒ์ง€,๋ช‡ํ‘œ)
# class : DB ํ…Œ์ด๋ธ”
# class์˜ variable : ์นผ๋Ÿผ (DB filed)
# class์˜ object : Row (DB record)

#question_text์™€ pub_date๋Š” db ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ ์ด๋ฆ„ 

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

โžก๏ธ vscode ์„ค๋ช… ์ถ”๊ฐ€ํ•˜๊ธฐ

#mysite/settings.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

โžก๏ธ ์•ฑ์˜ ํ˜„์žฌ์˜ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ installed_apps์— polls์— ์žˆ๋Š” contribd์— ์žˆ๋Š” pollsconfig ํด๋ž˜์Šค๋ฅผ ๋„ฃ๋Š”๋‹ค.

phthon manage.py makemigrations polls

โžก๏ธ makemigration์„ ์‹คํ–‰์‹œํ‚ด์œผ๋กœ์จ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝ์‹œํ‚จ ์‚ฌ์‹ค์„ ์žฅ๊ณ ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

api ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ - shell

#์‰˜์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ 
python manage.py shell

>>> from polls.models import Choice, Question  
#model class ์„ ํƒ์ง€์™€ ์งˆ๋ฌธ importํ•˜๊ธฐ

>>> Question.objects.all()
# qustion์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐธ์ ธ์˜ค๊ธฐ
<QuerySet []>
# question ๋‚ด์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ - ์•„์ง์—†๋Š” ์ƒํƒœ

# question๋‚ด์˜ ๋ฐ์ดํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ - ๋ชจ๋ธ์—๋Š” ์งˆ๋ฌธ๊ณผ ๋ฐœํ–‰์ผ์ง€ ์กด์žฌํ–ˆ์Œ
>>> from django.utils import timezone #๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# ๋ชจ๋ธ Question์˜ question_text์— "What's new" ๋ผ๋Š” ์งˆ๋ฌธ ์ถ”๊ฐ€ํ•ด q์— ๋„ฃ๊ธฐ 

# ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €! ์žฅ! 
>>> q.save()

# Now it has an ID.
# id๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์žฅ๊ณ ๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ.
>>> q.id
1
#์ด์ œ what's new๋ผ๋Š” ์งˆ๋ฌธ์˜ id๋Š” 1

# Access model field values via Python attributes.
# ๋‚ด๊ฐ€ ๋„ฃ์€ ํ…์ŠคํŠธ ํ™•์ธ
>>> q.question_text
"What's new?"
#๋‚ด๊ฐ€ ๋„ฃ์€ ๋ฐœํ–‰์ผ ํ™•์•ˆ
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# ํ…์ŠคํŠธ ์ˆ˜์ •๋„ ๊ฐ€๋Šฅ ๋Œ€์‹  save()๋ฅผ ํ•ด์ค˜์•ผ ํ•จ.
>>> q.question_text = "What's up?"
>>> q.save() #์ €์žฅ

# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ์žˆ๋Š” ์งˆ๋ฌธ์ด ๋ช‡๊ฐœ์ธ์ง€ ์•Œ์ˆ˜ ์žˆ์Œ. - ํ˜„์žฌ๋Š” 1๊ฐœ 

โžก๏ธ ํ•˜์ง€๋งŒ <Question: Question object (1)>์œผ๋กœ๋Š” ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๋“ฑ์˜ models.py๋ฅผ ์ˆ˜์ •ํ›„ ์‰˜์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ

#polls/models.py
import datetime

from django.db import models
from django.utils import timezone

# ๋‘ ๊ฐ€์ง€ ํ•„๋“œ๋ฅผ ๋งŒ๋“ฌ - Question(์งˆ๋ฌธ ๋‚ด์šฉ,๋ฐœํ–‰์ผ)๊ณผ Choice(์„ ํƒ์ง€,๋ช‡ํ‘œ)
# class : DB ํ…Œ์ด๋ธ”
# class์˜ variable : ์นผ๋Ÿผ (DB filed)
# class์˜ object : Row (DB record)

#question_text์™€ pub_date๋Š” db ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ ์ด๋ฆ„ 

class Question(models.Model): #DB ํ…Œ์ด๋ธ” for ์„ค๋ฌธ์กฐ์‚ฌ ์ฃผ์„ธ 
    question_text = models.CharField(max_length=200) # ์„ค๋ฌธ์กฐ์‚ฌ ์ฃผ์ œ ํ…์ŠคํŠธ(์งˆ๋ฌธ)
    pub_date = models.DateTimeField('date published') # 'date published' ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์งˆ ํ•ญ๋ชฉ๋ช…
    
    # ๋งจ ๋ฐ‘์˜ ์„ค๋ช…๊ณผ ๋™์ผ ์ฆ‰ shell์ด๋‚˜ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ DB ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋ƒˆ์„ ๋•Œ ๋ณด์—ฌ์ง€๋Š” ํ…์ŠคํŠธ๋ฅผ ์ง€์ • 
    def __str__(self):
        return self.question_text
    
    # ์ปค์Šคํ…€ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ :
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    # ํ˜„์žฌ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฃจ ์ „ ์‹œ์ ๋ณด๋‹ค ๋” ์ดํ›„์— ๋“ฑ๋ก๋œ Question์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์คŒ (true/fasle)

#ํ•˜๋‚˜์˜ question์˜ ๋‹ค์ˆ˜์˜ choice๋ฅผ ๊ฐ€์ง€๊ธฐ ๋–ผ๋ฌธ์— ์ผ๋Œ€๋‹ค ๊ตฌ์กฐ

class Choice(models.Model): #DB ํ…Œ์ด๋ธ” for ์„ค๋ฌธ์กฐ์‚ฌ ์ฃผ์ œ๋ณ„ ์„ ํƒ์ง€(+ ์„ ํƒ์ง€๋งˆ๋‹ค์˜ ๋“ํ‘œ ์ˆ˜)
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #์„ค๋ฌธ์กฐ์‚ฌ ์ฃผ์ œ์˜ id ๊ฐ’
    # foreignkey? - ์œ„์— ์ƒ์„ฑ๋œ Question์ด๋ผ๋Š” ๋ชจ๋ธ(ํ…Œ์ด๋ธ”)์„ ์ฐธ์กฐํ•จ.
    # CASCADE๋Š” ์œ„์˜ Question์˜ ๊ฐ’์ด ์‚ญ์ œ๋ ๋•Œ ์ด ์™ธ๋ž˜ํ‚ค๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋ธ row(์„ ํƒ์ง€)๋„ ์‚ญ์ œ๋œ๋‹ค๋Š” ์˜๋ฏธ
    choice_text = models.CharField(max_length=200) #์„ค๋ฌธ์กฐ์‚ฌ ์ฃผ์ œ์— ๋Œ€ํ•œ ์„ ํƒ์ง€ ํ…์ŠคํŠธ 
    votes = models.IntegerField(default=0) # ํ•ด๋‹น ์„ ํƒ์ง€์˜ ๋“ํ‘œ ์ˆ˜ 

    # ์‰˜์˜ <Question: Question object (1)> ์˜ ๋ฐฉ์‹์€ ๋ณ„ ๋„์›€์ด ์•ˆ๋จ. ๋”ฐ๋ผ์„œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์‰˜์—์„œ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ.
    def __str__(self): 
        return self.choice_text

โžก๏ธ ์‰˜์—์„œ ๊ฐ์ฒด์˜ ํ‘œํ˜„์„ ๋” ์ž์„ธํžˆ ๋ณด๊ฒŒํ•˜ ์ปค์Šคํ…€ ๋ฉ”์†Œ๋“œ๋‚˜ str()๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

#์‰˜์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ 
python manage.py shell

โžก๏ธ ๋‹ค์‹œ ์‰˜์„ ์‹คํ–‰ ์‹œ์ผœ์„œ ํ™•์ธํ•ด๋ณด๊ธฐ

>>> from polls.models import Choice, Question

# Make sure our __str__() addition worked.
# question ๋‚ด์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]> 
# models.py ๋‚ด์šฉ ์ˆ˜์ •์œผ๋กœ ์ธํ•œ str๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ ํ™•์ธ ๊ฐ€๋Šฅ # question_text์„ ๋ณผ ์ˆ˜ ์žˆ์Œ. ์›๋ž˜์€ <QuerySet [<Question: Question object (1)>]> ์ด๊ฑฐ ์˜€์Œ.

# Django provides a rich database lookup API that's entirely driven bykeyword arguments.
>>> Question.objects.filter(id=1) # id๊ฐ€ 1๋ฒˆ์ธ question์„ ๊ฐ€์ง€๊ณ  ์™€๋ผ
<QuerySet [<Question: What's up?>]>

>>>
Question.objects.filter(question_text__startswith='What') # ํ€˜์Šค์ฒœ ํ…์ŠคํŠธ๊ฐ€ what์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ ์™€๋ผ
<QuerySet [<Question: What's up?>]>


# Get the question that was published this year.
# ์˜ฌํ•ด ๋ฐœํ–‰๋œ ์งˆ๋ฌธ
>>> from django.utils import timezone # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ
>>> current_year = timezone.now().year #์˜ฌํ•ด
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

#๋งŒ์•ฝ์— ์—†๋Š” Id๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์—๋Ÿฌ
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

# Lookup by a primary key is the most common case, so Django provides a
# shortcut for primary-key exact lookups.
# ์ฆ‰ ๋‘˜์ด ๊ฐ™์Œ. 
# Question.objects.get(id=1) = Question.objects.get(pk=1)
>>> Question.objects.get(pk=1) # pk๊ฐ€ 1์ธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
<Question: What's up?>


>>> q = Question.objects.get(pk=1) # pk๊ฐ€ 1์ธ ๋ฐ์ดํ„ฐ๋ฅผ q์— ์ €์žฅ
>>> q.was_published_recently()  # ์ปค์Šคํ…€ ๋ฉ”์†Œ๋“œ๋กœ ํ™•์ธ(์ตœ๊ทผ์— ์ €์žฅ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ,)
True #์ตœ๊ทผ์— ๋งŒ๋“ค์–ด์ง! 

# Give the Question a couple of Choices. The create call constructs a new
# Choice object, does the INSERT statement, adds the choice to the set
# of available choices and returns the new Choice object. Django creates
# a set to hold the "other side" of a ForeignKey relation
# (e.g. a question's choice) which can be accessed via the API.
>>> q = Question.objects.get(pk=1) # pk๊ฐ€ 1์ธ question์„ q์— ์ €์žฅ

# Display any choices from the related object set -- none so far. 
#q์˜ ์„ ํƒ์ง€๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ - ์•„์ง ์—†๋Š”์ƒํƒœ
>>> q.choice_set.all() 
<QuerySet []>

# Create three choices. - 3๊ฐ€์ง€ ์ดˆ์ด์Šค ๋งŒ๋“ค๊ธฐ
>>> q.choice_set.create(choice_text='Not much', votes=0) 
<Choice: Not much> 
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0) 

# ๋งŒ๋“ค์–ด์ง„ Choice.object๋Š” question object์— ์ ‘๊ทผ ํ• ์ˆ˜ ์žˆ๋Š” api๋ฅผ ๊ฐ€์ง. ์ฆ‰ ๋Œ€๋‹ต์œผ๋กœ ์งˆ๋ฌธ ์ ‘๊ทผ ๊ฐ€๋Šฅ.
# Choice objects have API access to their related Question objects.
>>> c.question
<Question: What's up?>

# ๋ฐ˜๋Œ€๋„ ๊ฐ€๋Šฅ- ์งˆ๋ฌธ์œผ๋กœ ์ดˆ์ด์Šค ์ ‘๊ทผ ๊ฐ€๋Šฅ
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

>>> q.choice_set.count() # ์ดˆ์ด์Šค ๋ช‡๊ฐœ์ธ์ง€ ํ™•์ธ
3

# The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships. # ๊ด€๊ณ„๋ฅผ ๋‚˜๋ˆŒ๋•Œ ์‚ฌ์šฉ
# This works as many levels deep as you want; there's no limit.
# Find all Choices for any question whose pub_date is in this year
# (reusing the 'current_year' variable we created above). 
# ์œ„์— ์‚ฌ์šฉํ•œ ๊ฒƒ current_year ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ๋„ฃ์œผ๋ฉด
#---
>>> from django.utils import timezone # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
#---
#choice๊ฐ€ ์˜ฌํ•ด ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธ
>>> Choice.objects.filter(question__pub_date__year=current_year) #์˜ฌํ•ด ๋งŒ๋“ค์–ด์ง„ choice๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

# Let's delete one of the choices. Use delete() for that. ์‚ญ์ œํ•˜๊ธฐ
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking') #ํ•ดํ‚น์„ ์‚ญ์ œ
>>> c.delete()

๊ด€๋ฆฌ์ž ์ƒ์„ฑํ•˜๊ธฐ

python manage.py createsuperuser

#์›ํ•˜๋Š” ์œ ์ €๋„ค์ž„๊ณผ ์ด๋ฉ”์ผ , ํŒจ์Šค์›Œ๋“œ ๋„ฃ๊ธฐ 
Username : 
Email address : 
#์„œ๋ฒ„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  http://127.0.0.1:8000/admin/์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ
python manage.py runserver
  • ๊ด€๋ฆฌ์ž ์‚ฌ์ดํŠธ์—์„œ poll app ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ
#polls/admin.py
from django.contrib import admin

from .models import Question

admin.site.register(Question)

โžก๏ธ admin.py๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ด€๋ฆฌ ์‚ฌ์ดํŠธ์—์„œ polls๋ผ๋Š” ์•ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€