McM
mcm@noway.es
Contact me: noway.es
Contact me

First Django Simple Application(Page3)

Creando la primera aplicación

Ya hemos creado el primer proyecto Django, pasemos ahora a crear la primera aplicación. Cada aplicación Django consiste en un paquete Python que, por consiguiente, deberá estar en el path de tu sistema. De igual manera que hemos creado el proyecto, Django ofrece una utilidad para crear la estructura de una aplicación:

(en el directorio del proyecto prueba)

mcm@McM:/tmp/prueba$ python manage.py startapp polls
mcm@McM:/tmp/prueba$ tree polls/
polls/
|-- __init__.py
|-- models.py
|-- tests.py
`-- views.py

Definiremos ahora nuestro primer modelo. La manera de actuar es la siguiente:

  • creamos modelo de datos
  • sincronizamos nuestra aplicación Django con la BBDD (syncdb)

mcm@McM:/tmp/prueba$ vim polls/models.py

from django.db import models

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

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

Se recomienda mirar la documentación más detenidamente para ver los tipos de variables que se pueden definir en un modelo ( charField, IntegerField, DateTimeField, ...).
Podeis observar como hemos introducido aquí la primera relación entre modelos (recordad modelo = tabla) poll = models.ForeignKey(Poll). De esta manera relacionamos el modelo Choice con el modelo Poll. Todo modelo Choice tendra un campo Poll que corresponde con una entrada en la tabla del modelo Poll.

Esta nueva aplicación, polls, tendrá que ser añadida en el settings.py para que el framework Django la encuentre:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'mysite.polls'
)

Otra de las utilidades de manage.py es poder ver exactamente la sentencia que Django lanza internamente al crear las tablas en la BBDD. Esto resultará muy util cuando tengais que modificar modelos y alterar tablas...

Ojo: si no añadimos la aplicación al settings.py, obtendremos el siguiente error:

mcm@McM:/tmp/prueba$ python manage.py sql polls
Error: App with label polls could not be found. Are you sure your INSTALLED_APPS setting is correct?

Si todo va bien y no nos hemos olvidado de configurar el settings.py añadiendo la nueva aplicación:

mcm@McM:/tmp/prueba$ python manage.py sql polls

  from sets import ImmutableSet
BEGIN;
CREATE TABLE `polls_poll` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `question` varchar(200) NOT NULL,
    `pub_date` datetime NOT NULL
)
;
CREATE TABLE `polls_choice` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `poll_id` integer NOT NULL,
    `choice` varchar(200) NOT NULL,
    `votes` integer NOT NULL
)
;
ALTER TABLE `polls_choice` ADD CONSTRAINT `poll_id_refs_id_5d896c23` FOREIGN KEY (`poll_id`) REFERENCES `polls_poll` (`id`);
COMMIT;

Otras utilidades del manage.py son las siguientes:

  • python manage.py validate -- comprueba errores en tu modelo de datos
  • python manage.py sqlcustom polls -- saca por pantalla cualquier sentencia sql de tus modelos.
  • python manage.py sqlclear polls -- saca por pantalla las sentencias DROP TABLE para esta aplicación teneiendo en cuenta las dependencias añadidas
  • python manage.py sqlindexes polls -- saca por pantalla las sentencias CREATE INDEX para esta aplicación.
  • python manage.py sqlall polls -- combinación de todos los comandos sql.

mcm@McM:/tmp/prueba$ python manage.py syncdb

Creating table django_admin_log
Creating table polls_poll
Creating table polls_choice
Installing index for admin.LogEntry model
Installing index for polls.Choice model

Ahora si miramos la BBDD, observaremos estas dos nuevas tablas creadas.

mysql> show tables;
+----------------------------+
| Tables_in_linvix           |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_message               |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_session             |
| django_site                |
| polls_choice               |
| polls_poll                 |
+-------------------------

Ahora podemos añadir métodos para cada uno de esos modelos. Al ser métodos y no nuevos parámetros no hará falta modificar la BBDD (alter) ni sincronizar la aplicación nuevamente.

import datetime
# [...]
class Poll(models.Model):
    # [...]
    def was_published_today(self):
        return self.pub_date.date() == datetime.date.today()

Llegados a este punto podeis jugar un poco con la consola y el API que ofrece Django. Lo más seguro es que se utilicen las mismas sentencias en las vistas. Si es tu primer toma de contacto quizas te resulte un poco raro.

mcm@McM:/tmp/prueba$ python manage.py shell
  from sets import ImmutableSet
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from prueba.polls.models import Poll, Choice
>>> Poll.objects.all()
[]
>>> import datetime
>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now())
>>> p.save()
>>> Poll.objects.all()
[<Poll: Poll object>]
>>> Poll.objects.all()[0]
<Poll: Poll object>
>>> Poll.objects.all()[0].id
1L
>>>

En esta consola interactiva se puede jugar un poco con los modelos. Por ejemplo Poll.objects.all() devuelve todos los objetos tipo Poll en una lista. Django utiliza muchisimo las listas para este tipo de sentencias. Así podemos acceder al indice 0 donde se encuentra la primera Poll creada.

Se pueden hacer infinidad de cosas y poner los filtros que queramos para objener los elementos deseados. A continuación creamos opciones:

>>> p = Poll.objects.get(pk=1)
>>> p.choice_set.create(choice='Not much', votes=0)
<Choice: Choice object>
>>> p.choice_set.create(choice='The sky', votes=0)
<Choice: Choice object>
>>> c = p.choice_set.create(choice='Just hacking again', votes=0)
>>> c.poll
<Poll: Poll object>
>>> p.choice_set.all()
[<Choice: Choice object>, <Choice: Choice object>, <Choice: Choice object>]

No merece la pena entreneterse más. Para ver más sobre la API de la BBDD podeis acudir a : http://docs.djangoproject.com/en/dev/topics/db/queries/#topics-db-queries

A continuación se hace una pequeña introducción al admin site de Django. Una de las grandes ventajas de este framework.

Share it!

Twitter Gmail Delicious Google Bookmarks Hotmail Yahoo Mail Share/Bookmark