---
title: "Scríobh do chéad aip Django, cuid 2"
version: 6.1
locale: ga
source: https://docs.djangoproject.com/ga/6.1/intro/tutorial02/
canonical: https://djangodocs.dev/ga/6.1/intro/tutorial02/
---
# Scríobh do chéad aip Django, cuid 2

Tosaíonn an rang teagaisc seo nuair a d'fhág :d oc:Tutorial 1 \</intro/tutorial01\>. Cuirfimid an bunachar sonraí ar bun, cruthóimid do chéad mhúnla, agus cuirfimid réamhrá tapa ar shuíomh riaracháin Django a ghintear go huathoibríoch.

> **Cá háit le cabhair a fháil:**
>
> Má tá deacracht agat dul tríd an rang teagaisc seo, téigh ar aghaidh chuig an rannán :d oc:'Getting Help\</faq/help\>' den rannán Ceisteanna Coitianta.

## Socrú bunachar sonraí

Anois, oscail suas `mysite/settings.py`. Is gnáth-mhodúl Python é le hathróga ar leibhéal an mhodúil a léiríonn suíomhanna Django.

De réir réamhshocraithe, úsáideann an chumraíocht [`DATABASES`](/ga/6.1/ref/settings/#std-setting-DATABASES) SQLite. Más rud é go bhfuil bunachair shonraí nua agat, nó mura bhfuil suim agat ach Django a thriail, is é seo an rogha is éasca. Tá SQLite san áireamh i Python, mar sin ní bheidh ort aon rud eile a shuiteáil chun tacú le do bhunachar sonraí. Agus do chéad tionscadal fíor á thosú, áfach, b'fhéidir gur mhaith leat úsáid a bhaint as bunachar sonraí níos inscálaithe cosúil le PostgreSQL, chun tinneas cinn a bhaineann le hathrú bunachar sonraí a sheachaint.

Más mian leat bunachar sonraí eile a úsáid, féach [mionsonraí chun do bhunachar sonraí a shaincheapadh agus a chur ar siúl](/ga/6.1/topics/install/#database-installation).

Agus tú ag eagarthóireacht :comhad: mysite/settings.py, socraigh [`TIME_ZONE`](/ga/6.1/ref/settings/#std-setting-TIME_ZONE) chuig do chrios ama.

Chomh maith leis sin, tabhair faoi deara an socrú [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS) ag barr an chomhaid. Coinníonn sé sin ainmneacha na bhfeidhmchlár Django go léir atá i ngníomh sa chás Django seo. Is féidir feidhmchláir a úsáid i dtionscadail iolracha, agus is féidir leat iad a phacáistiú agus a dháileadh lena n-úsáid ag daoine eile ina dtionscadail.

De réir réamhshocraithe, : socrú: tá na haipeanna seo a leanas i INSTALLED\_APPS, agus tagann gach ceann díobh le Django:

- [`django.contrib.admin`](/ga/6.1/ref/contrib/admin/#module-django.contrib.admin) -- An suíomh riaracháin. Bainfidh tú úsáid as gan mhoill.
- [`django.contrib.auth`](/ga/6.1/topics/auth/#module-django.contrib.auth) -- Córas fíordheimhnithe.
- [`django.contrib.contenttypes`](/ga/6.1/ref/contrib/contenttypes/#module-django.contrib.contenttypes) -- Creat le haghaidh cineálacha ábhair.
- :mod:'django.contrib.sessions' -- Creat seisiúin.
- :mod:'django.contrib.messages' -- Creat teachtaireachtaí.
- :mod:'django.contrib.staticfiles' -- Creat chun comhaid statacha a bhainistiú.

These applications are included by default as a convenience for the common
case.

Baineann cuid de na feidhmchláir seo úsáid as tábla bunachar sonraí amháin ar a laghad, áfach, mar sin ní mór dúinn na táblaí a chruthú sa bhunachar sonraí sular féidir linn iad a úsáid. Chun é sin a dhéanamh, rith an t-ordú seo a leanas:

```console
$ python manage.py migrate
```

*Windows*

```doscon
...\> py manage.py migrate
```

The [`migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate) command looks at the [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS) setting
and creates any necessary database tables according to the database settings in
your `mysite/settings.py` file and the database migrations shipped with
the app (we'll cover those later). You'll see a message for each migration it
applies. If you're interested, run the command-line client for your database
and type `\dt` (PostgreSQL), `SHOW TABLES;` (MariaDB, MySQL), `.tables`
(SQLite), or `SELECT TABLE_NAME FROM USER_TABLES;` (Oracle) to display the
tables Django created.

> **Do na íostach**
>
> Like we said above, the default applications are included for the common
> case, but not everybody needs them. If you don't need any or all of them,
> feel free to comment-out or delete the appropriate line(s) from
> [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS) before running [`migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate). The
> [`migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate) command will only run migrations for apps in
> [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS).

## Samhlacha a chruthú

Anois déanfaimid do mhúnlaí a shainiú - go bunúsach, do leagan amach bunachar sonraí, le meiteashonraí breise.

> **Fealsúnacht**
>
> Is éard is samhail ann ná an fhoinse amháin, deifnídeach faisnéise faoi do shonraí. Cuimsíonn sé na réimsí riachtanacha agus iompraíochtaí na sonraí atá á stóráil agat. Leanann Django an [TIRIM Prionsabal](/ga/6.1/misc/design-philosophies/#dry). Is é an sprioc ná do mhúnla sonraí a shainiú in aon áit amháin agus rudaí a dhíorthú go huathoibríoch uaidh.
>
> This includes the migrations, which are derived from your models file.
> They form a history that Django uses to update your database schema
> to match your current models.

In ár app vótaíochta, cruthóimid dhá mhúnla: \`\` Ceist\`\` agus \`\` Rogha\`\`. Tá ceist agus dáta foilsithe ag `Ceist`. Tá dhá réimse ag `Choice`: téacs na rogha agus scóir vóta. Baineann gach `Rogha` le `Ceist`.

Déanann ranganna Python ionadaíocht ar na coincheapa seo. Cuir an comhad  in eagar ionas go mbeidh cuma air seo:

*`polls/models.py`*

```python
from django.db import models

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)
```

Anseo, déantar ionadaíocht ar gach samhail ag aicme a fho-aicmí :aicme: django.db.models.Model. Tá roinnt athróg ranga ag gach samhail, agus léiríonn gach ceann acu réimse bunachar sonraí sa tsamhail.

Léirítear gach réimse ag sampla de  rang -- m.sh.,  le haghaidh réimsí carachtar agus  le haghaidh amanna dáta. Insíonn sé seo do Django cén cineál sonraí atá i seilbh gach réimse.

Is é ainm gach  shampla (m.sh. `question_text` nó \`\` pub\_date\`\`) ainm an réimse, i bhformáid meaisín-chairdiúil. Úsáidfidh tú an luach seo i do chód Python, agus úsáidfidh do bhunachar sonraí é mar ainm an cholúin.

Is féidir leat an chéad argóint suímh roghnach a úsáid chuig:rang:~django.db.models.Field chun ainm atá inléite ag an duine a ainmniú. Úsáidtear é sin i gcúpla cuid introspective de Django, agus déantar é a dhúbailt mar dhoiciméadú. Mura soláthraítear an réimse seo, úsáidfidh Django an t-ainm meaisín-inléite. Sa sampla seo, níl ach ainm inléite daonna sainmhínithe againn do `Question.pub_date`. I gcás gach réimse eile sa mhúnla seo, is leor ainm meaisín-inléite na páirce mar a ainm inléite ag an duine.

Bhí argóintí ag teastáil ó roinnt ranganna . , mar shampla, éilíonn tú [`max_length`](/ga/6.1/ref/models/fields/#django.db.models.CharField.max_length) a thabhairt dó. Úsáidtear é sin ní hamháin sa scéimre bunachar sonraí, ach i mbailíochtú, mar a fheicfimid go luath.

A [`Field`](/ga/6.1/ref/models/fields/#django.db.models.Field) can also have various optional arguments; in
this case, we've set the [`default`](/ga/6.1/ref/models/fields/#django.db.models.Field.default) value of
`votes` to 0.

Ar deireadh, tabhair faoi deara go bhfuil gaol sainithe, ag baint úsáide as [`ForeignKey`](/ga/6.1/ref/models/fields/#django.db.models.ForeignKey). Deir sé sin le Django go bhfuil gach `Rogha` gaolmhar le `Ceist` amháin. Tacaíonn Django leis na caidrimh bhunachar sonraí coitianta go léir: go leor le duine, go leor le go leor, agus duine le duine.

## Samhlacha a ghníomhachtú

Tugann an cód múnla beag sin go leor faisnéise do Django. Leis, tá Django in ann:

- Cruthaigh scéimre bunachar sonraí (ráitis `CREATE TABLE`) don aip seo.
- Cruthaigh API le rochtain ar bhunachar sonraí Python chun réada `Ceist` agus `Choice` a rochtain.

Ach ar dtús ní mór dúinn a rá lenár dtionscadal go bhfuil an aip `vótaíochta` suiteáilte.

> **Fealsúnacht**
>
> Tá aipeanna Django “in-phlugtha”: Is féidir leat aip a úsáid i dtionscadail iolracha, agus is féidir leat aipeanna a dháileadh, toisc nach gá iad a bheith ceangailte le suiteáil Django ar leith.

Chun an aip a chur san áireamh inár dtionscadal, ní mór dúinn tagairt a dhéanamh dá rang cumraíochta sa socrú [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS). Tá an rang `PollsConfig` sa chomhad , mar sin is é an cosán poncaithe atá aige ná `` ` pobalbhreith.apps.PollsConfig ``. Cuir an comhad  in eagar agus cuir an cosán poncaithe sin leis an socrú ::INSTALLED\_APPS. Beidh sé cuma mar seo:

*`mysite/settings.py`*

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

Anois tá a fhios ag Django an aip toghcháin\` a chur san áireamh. Rithfimid ordú eile:

```console
$ python manage.py makemigrations polls
```

*Windows*

```doscon
...\> py manage.py makemigrations polls
```

Ba cheart duit rud éigin cosúil leis an méid seo a leanas a fheiceáil:

```text
Migrations for 'polls':
  polls/migrations/0001_initial.py
    + Create model Question
    + Create model Choice
```

Trí `makemigrations` a rith, tá tú ag insint do Django go bhfuil roinnt athruithe déanta agat ar do mhúnlaí (sa chás seo, tá cinn nua déanta agat) agus gur mhaith leat na hathruithe a stóráil mar \* imirce .

Is éard atá i gceist le himircí ná mar a stórálann Django athruithe ar do mhúnlaí (agus dá bhrí sin do scéimre bunachar sonraí) - is comhaid ar diosca iad. Is féidir leat an t-aistriú do do mhúnla nua a léamh más maith leat; is é an comhad `polls/migrations/0001_initial.py`. Ná bíodh imní ort, ní bheifear ag súil go léifidh tú iad gach uair a dhéanann Django ceann, ach tá siad deartha le gur féidir iad a chur in eagar ag an duine ar eagla go dteastaíonn uait an chaoi a n-athraíonn Django rudaí a athrú de láimh.

Tá ordú ann a reáchtálfaidh na himscrúduithe duit agus a bhainisteoidh scéimre do bhunachar sonraí go huathoibríoch - ar a dtugtar : djadmin: imirce, agus tiocfaimid chuige faoi láthair - ach ar dtús, feicfimid cad a rithfeadh SQL leis an imirce sin. Tógann an t-ordú : djadmin:sqlmigrate ainmneacha imirce agus cuireann sé a SQL ar ais:

```console
$ python manage.py sqlmigrate polls 0001
```

*Windows*

```doscon
...\> py manage.py sqlmigrate polls 0001
```

Ba cheart duit rud éigin cosúil leis an méid seo a leanas a fheiceáil (rinneamar é a athfhormáidiú le haghaidh inléiteachta):

```sql
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL,
    "question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");

COMMIT;
```

Tabhair faoi deara iad seo a leanas:

- Athróidh an t-aschur cruinn ag brath ar an mbunachar sonraí atá in úsáid agat. Gintear an sampla thuas do PostgreSQL.
- Gintear ainmneacha táblaí go huathoibríoch trí ainm na haipe (\`\` pobalbhreith\`\`) agus ainm litreacha beaga na samhla a chomhcheangal -- \`\` ceist\`\` agus \`\` rogha\`\`. (Is féidir leat an iompar seo a shárú.)
- Cuirtear eochracha príomhúla (IDs) leis go huathoibríoch. (Is féidir leat é seo a shárú freisin.)
- De réir an ghnáis, cuireann Django \`\` "\_id"\`\` i gceangal leis an ainm réimse eochrach eochrach. (Sea, is féidir leat é seo a shárú, chomh maith.)
- Léirítear an gaol eochrach eachtrach le srian `eochair Choigríche`. Ná bíodh imní ort faoi na codanna `DEFERRABLE`; tá sé ag rá le PostgreSQL gan an eochair choigríche a fhorghníomhú go dtí deireadh an idirbhirt.
- Tá sé in oiriúint don bhunachar sonraí atá in úsáid agat, mar sin cineálacha réimse a bhaineann go sonrach leis an mbunachar sonraí ar nós \`\` auto\_increment\`\` (MySQL), `bigint PRIMARY EOCHAIR A GHINEÁLaítear GAN RÉAMHSHLÁN MAR FHÉINIÚLACHT` (PostgreSQL), nó \`\` uath-incrimint phríomhúil Láimhseáiltear \`\` (SQLite) duit go huathoibríoch. Baineann an rud céanna le hainmneacha páirce a lua -- m.sh., ag baint úsáide as Sleachta dúbailte nó Sleachta singil.
- Ní ritheann an t-ordú [`sqlmigrate`](/ga/6.1/ref/django-admin/#django-admin-sqlmigrate) an t-imirce ar do bhunachar sonraí - ina ionad sin, priontaí sé chuig an scáileán ionas gur féidir leat a fheiceáil cad a cheapann SQL Django atá ag teastáil. Tá sé úsáideach chun a sheiceáil cad atá le déanamh ag Django nó má tá riarthóirí bunachar sonraí agat a dteastaíonn scripteanna SQL le haghaidh athruithe.

Má tá suim agat, is féidir leat [`seiceáil python manage.py`](/ga/6.1/ref/django-admin/#django-admin-check) a rith freisin; seiceálann sé seo aon fhadhbanna i do thionscadal gan ascnaimh a dhéanamh nó teagmháil a dhéanamh leis an mbunachar sonraí.

Anois, rith [`migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate) arís chun na táblaí samhail sin a chruthú i do bhunachar sonraí:

```console
$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK
```

*Windows*

```doscon
...\> py manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK
```

Tógann an t-ordú [`migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate) gach ascnamh nár cuireadh i bhfeidhm (rianann Django cé na cinn a chuirtear i bhfeidhm le tábla speisialta i do bhunachar sonraí darb ainm `django_migrations`) agus ritheann sé i gcoinne do bhunachar sonraí - go bunúsach, sioncrónú an athruithe a rinne tú ar do mhúnlaí leis an scéimre sa bhunachar sonraí.

Tá imircigh an-chumhachtach agus ligeann siad duit do mhúnlaí a athrú le himeacht ama, de réir mar a fhorbraíonn tú do thionscadal, gan gá do bhunachar sonraí nó do tháblaí a scriosadh agus cinn nua a dhéanamh - speisialtóireacht sé do bhunachar sonraí a uasghrádú beo, gan sonraí a chailliúint. Déanfaimid iad a chlúdach níos doimhne i gcuid níos déanaí den rang teagaisc, ach faoi láthair, cuimhnigh ar an treoir trí chéim chun athruithe múnla a dhéanamh:

- Athraigh do mhúnlaí (i `models.py`).
- Run [`python manage.py makemigrations`](/ga/6.1/ref/django-admin/#django-admin-makemigrations) to create
  migrations for those changes.
- Rith [`python manage.py migrate`](/ga/6.1/ref/django-admin/#django-admin-migrate) chun na hathruithe sin a chur i bhfeidhm ar an mbunachar sonraí.

Is é an fáth go bhfuil orduithe ar leith ann chun ascnaimh a dhéanamh agus a chur i bhfeidhm ná go ndéanfaidh tú ascnaimh chuig do chóras rialaithe leagan agus seolfaidh tú le d'aip iad; ní hamháin go ndéanann siad d'fhorbairt níos éasca, is féidir le forbróirí eile iad a úsáid agus i dtáirgeadh.

Léigh an [doiciméadúchán django-admin](/ga/6.1/ref/django-admin/) chun faisnéis iomlán a fháil faoin méid is féidir leis an bhfóntas `manage.py` a dhéanamh.

## Ag imirt leis an API

Anois, léim isteach sa bhlaosc Python idirghníomhach agus imirt timpeall leis an API saor in aisce a thugann Django duit. Chun an bhlaosc Python a agairt, bain úsáid as an ordú seo:

```console
$ python manage.py shell
```

*Windows*

```doscon
...\> py manage.py shell
```

We're using this instead of simply typing "python", because `manage.py`
sets the [`DJANGO_SETTINGS_MODULE`](/ga/6.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE) environment variable, which gives
Django the Python import path to your `mysite/settings.py` file.
By default, the [`shell`](/ga/6.1/ref/django-admin/#django-admin-shell) command automatically imports the models from
your [`INSTALLED_APPS`](/ga/6.1/ref/settings/#std-setting-INSTALLED_APPS).

Nuair a bheidh tú sa bhlaosc, scrúdaigh an [database API](/ga/6.1/topics/db/queries/):

```pycon
# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>

# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# Save the object into the database. You have to call save() explicitly.
>>> q.save()

# Now it has an ID.
>>> q.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=datetime.UTC)

# Change values by changing the attributes, then calling 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)>]>
```

Fan nóiméad. ```<Ceist: Ceist oibiachta (1)> Ní léiriú cabhrach é `` ar an oibiacht seo. Déanaimis é sin a shocrú tríd an múnla ``Ceist``` a chur in eagar (sa chomhad `vótaíocht/models.py`) agus modh [`__str__()`](/ga/6.1/ref/models/instances/#django.db.models.Model.__str__) a chur leis an dá ```Ceist `` agus ``Rogha```:

*`polls/models.py`*

```python
from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text
```

Tá sé tábhachtach modhanna [`__str__()`](/ga/6.1/ref/models/instances/#django.db.models.Model.__str__) a chur le do mhúnlaí, ní hamháin ar mhaithe le do chaoithiúlacht féin agus tú ag déileáil leis an leid idirghníomhach, ach freisin toisc go n-úsáidtear léiriúcháin oibiachtaí ar fud Django a ghintear go huathoibríoch riar.

Cuirfimid modh saincheaptha leis an múnla seo freisin:

*`polls/models.py`*

```python
import datetime

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

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
```

Tabhair faoi deara gur cuireadh \`\` am allmhairiú dáta\`\` agus \`\` ó chrios ama iompórtála django.utils\`\` leis, chun tagairt a dhéanamh do mhodúl caighdeánach Python :mod:\` datetime\` agus fóntais a bhaineann le crios ama Django i :mod:\` django.utils. crios ama\`, faoi seach. Mura bhfuil tú eolach ar láimhseáil crios ama i Python, is féidir leat níos mó a fhoghlaim sa [doiciméid tacaíochta crios ama](/ga/6.1/topics/i18n/timezones/).

Save these changes and start a new Python interactive shell. (If a
three-chevron prompt (\>\>\>) indicates you are still in the shell, you need to
exit first using `exit()`). Run `python manage.py shell` again to reload
the models.

```pycon
# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

# Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="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?>

# Request an ID that doesn't exist, this will raise an exception.
>>> 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.
# The following is identical to Question.objects.get(id=1).
>>> Question.objects.get(pk=1)
<Question: What's up?>

# Make sure our custom method worked.
>>> q = Question.objects.get(pk=1)
>>> 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 (defined as "choice_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)

# Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
<QuerySet []>

# Create three choices.
>>> 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 objects have API access to their related Question objects.
>>> c.question
<Question: What's up?>

# And vice versa: Question objects get access to Choice objects.
>>> 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).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<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()
```

Chun tuilleadh eolais a fháil ar chaidreamh samhlacha, féach [Rochtain ar réada gaolmhara](/ga/6.1/ref/models/relations/). Chun tuilleadh eolais a fháil ar conas béim dhúbailte a úsáid chun cuardaigh allamuigh a dhéanamh tríd an API, féach [Field lookups](/ga/6.1/topics/db/queries/#field-lookups-intro). Le haghaidh sonraí iomlána ar API an bhunachair shonraí, féach ar ár [Tagairt API Bunachar Sonraí](/ga/6.1/topics/db/queries/).

## Riarachán Django a thabhairt isteach

> **Fealsúnacht**
>
> Is obair dhian é suíomhanna riaracháin a ghiniúint chun go bhféadfaidh d’fhoireann nó do chliaint ábhar a chur leis, a athrú agus a scriosadh nach dteastaíonn mórán cruthaitheachta. Ar an ábhar sin, déanann Django uathoibriú go hiomlán ar chruthú comhéadain riaracháin le haghaidh samhlacha.
>
> Scríobhadh Django i dtimpeallacht seomra nuachta, le deighilt an-soiléir idir "foilsitheoirí ábhar" agus an suíomh "poiblí". Úsáideann bainisteoirí láithreáin an córas chun scéalta nuachta, imeachtaí, scóir spóirt, etc., a chur leis, agus taispeántar an t-ábhar sin ar an suíomh poiblí. Réitíonn Django an fhadhb a bhaineann le comhéadan aontaithe a chruthú do riarthóirí láithreáin chun ábhar a chur in eagar.
>
> Níl an riarthóir ceaptha le húsáid ag cuairteoirí suímh. Is do bhainisteoirí láithreán é.

### Úsáideoir admin a chruthú

Ar dtús beidh orainn úsáideoir a chruthú a bheidh in ann logáil isteach ar an suíomh riaracháin. Rith an t-ordú seo a leanas:

```console
$ python manage.py createsuperuser
```

*Windows*

```doscon
...\> py manage.py createsuperuser
```

Cuir isteach an t-ainm úsáideora atá uait agus brúigh Enter.

```text
Username: admin
```

Tabharfar leid duit ansin do sheoladh ríomhphoist atá uait:

```text
Email address: admin@example.com
```

Is é an chéim dheireanach ná do phasfhocal a chur isteach. Iarrfar ort do phasfhocal a chur isteach faoi dhó, an dara huair mar dheimhniú ar an gcéad cheann.

```text
Password: **********
Password (again): *********
Superuser created successfully.
```

### Tosaigh an freastalaí forbartha

Tá suíomh riaracháin Django gníomhachtaithe de réir réamhshocraithe. A ligean ar tús a chur leis an bhfreastalaí forbartha agus é a iniúchadh.

Mura bhfuil an freastalaí ag rith cuir tús leis mar seo:

```console
$ python manage.py runserver
```

*Windows*

```doscon
...\> py manage.py runserver
```

Anois, oscail brabhsálaí gréasáin agus téigh go dtí "/admin/" ar d'fhearann ​​​​áitiúil -- m.sh., <http://127.0.0.1:8000/admin/>. Ba cheart duit scáileán logáil isteach an riarthóir a fheiceáil:

![Django scáileán logáil isteach admin](intro/_images/admin01.png)

Ós rud é go gcuirtear [translation](/ga/6.1/topics/i18n/translation/) ar siúl de réir réamhshocraithe, má shocraíonn tú :LANGUAGE\_CODE, taispeánfar an scáileán logála isteach sa teanga a thugtar (má tá aistriúcháin chuí ag Django).

### Cuir isteach an suíomh admin

Anois, bain triail as logáil isteach leis an gcuntas sár-úsáideoir a chruthaigh tú sa chéim roimhe seo. Ba cheart duit an leathanach innéacs riaracháin Django a fheiceáil:

![Leathanach innéacs admin Django](intro/_images/admin02.png)

Ba cheart go bhfeicfeá roinnt cineálacha ábhar in eagar: grúpaí agus úsáideoirí. Soláthraítear iad ag [`django.contrib.auth`](/ga/6.1/topics/auth/#module-django.contrib.auth), an creat fíordheimhnithe seolta ag Django.

### Déan an aip vótaíochta inathraithe sa riarthóir

Ach cá bhfuil ár n-aip vótaíochta? Níl sé ar taispeáint ar an leathanach innéacs admin.

Níl ach rud amháin eile le déanamh: ní mór dúinn a rá leis an riarthóir go bhfuil comhéadan riaracháin ag réada `Ceist`. Chun seo a dhéanamh, oscail an comhad ::polls/admin.py, agus cuir in eagar é chun breathnú mar seo:

*`polls/admin.py`*

```python
from django.contrib import admin

from .models import Question

admin.site.register(Question)
```

### Déan iniúchadh ar fheidhmiúlacht admin saor in aisce

Anois agus `Ceist` cláraithe againn, tá a fhios ag Django gur cheart é a thaispeáint ar an leathanach innéacs riaracháin:

![Leathanach innéacs admin Django, anois le pobalbhreith ar taispeáint](intro/_images/admin03t.png)

Cliceáil "Ceisteanna". Anois tá tú ag an leathanach "liosta athraithe" le haghaidh ceisteanna. Taispeánann an leathanach seo na ceisteanna go léir sa bhunachar sonraí agus ligeann sé duit ceann a roghnú chun é a athrú. Tá an "Cad atá ar bun?" ceist a chruthaigh muid níos luaithe:

![Athraítear leathanach liosta na vótaíochtaí](intro/_images/admin04t.png)

Cliceáil ar an gcnaipe "Cad atá ar bun?" ceist chun é a chur in eagar:

![Foirm eagarthóireachta don ábhar ceiste](intro/_images/admin05t.png)

Rudaí le tabhairt faoi deara anseo:

- Gintear an fhoirm go huathoibríoch ón múnla `Ceist`.
- Freagraíonn na cineálacha éagsúla réimse samhlacha (, ) don ghiuirléid ionchur HTML cuí. Tá a fhios ag gach cineál réimse conas é féin a thaispeáint sa riarthóir Django.
- Faigheann gach  aicearraí JavaScript saor in aisce. Faigheann dátaí aicearra "Inniu" agus aníos aníos féilire, agus faigheann uaireanta aicearra "Anois" agus mír aníos áisiúil a liostaíonn na hamanna a chuirtear isteach go coitianta.

Tugann an chuid íochtair den leathanach cúpla rogha duit:

- Sábháil -- Sábháil athruithe agus filleann sé ar an leathanach liosta athruithe don chineál seo oibiachta.
- Sábháil agus lean ar aghaidh leis an eagarthóireacht -- Sábháil na hathruithe agus athlódálann sé an leathanach riaracháin don réad seo.
- Sábháil agus cuir ceann eile leis -- Sábháil athruithe agus lódálann sé foirm bhán nua don chineál seo réad.
- Scrios -- Taispeánann sé leathanach deimhnithe scriosta.

Mura dtagann luach "Dáta foilsithe" leis an am ar chruthaigh tú an cheist i [Teagasc 1](/ga/6.1/intro/tutorial01/), is dócha go gciallaíonn sé go ndearna tú dearmad ar an luach ceart a shocrú don :setting:\` socrú TIME\_ZONE\`. Athraigh é, athlódáil an leathanach agus seiceáil go bhfuil an luach ceart le feiceáil.

Athraigh an "Dáta foilsithe" trí chliceáil ar na aicearraí "Inniu" agus "Anois". Ansin cliceáil "Sábháil agus leanúint ar aghaidh leis an eagarthóireacht." Ansin cliceáil "Stair" ar dheis uachtarach. Feicfidh tú leathanach ina liostaítear na hathruithe go léir a rinneadh ar an réad seo tríd an riarthóir Django, le stampa ama agus ainm úsáideora an duine a rinne an t-athrú:

![Leathanach staire don ábhar ceiste](intro/_images/admin06t.png)

Nuair atá tú ar do chompord le API na múnlaí agus nuair a bheidh an suíomh riaracháin curtha ar an eolas agat, léigh [cuid 3 den rang teagaisc seo](/ga/6.1/intro/tutorial03/) chun tuilleadh eolais a fháil faoi conas tuilleadh tuairimí a chur lenár bhfeidhmchlár pobalbhreithe.
