Revista Informática

Django desde Cero: Relaciones o Asociaciones en Base de Datos (Parte I)

Publicado el 31 octubre 2013 por Codehero @codeheroblog

Hoy, vamos a ver como crear asociaciones en las bases de datos con la ayuda de Django, como crear el formulario para rellenar dicha asociación, como definir el url que nos va ayudar a crear las asociaciones y finalmente como crear la vista la cual va a procesar la información que guardemos en dicho formulario.

La próxima semana veremos como crear el template o la plantilla necesaria para crear el comentario, agregaremos un botón el cual nos va a permitir desde el artículo agregar los comentarios y por último, veremos como desplegar todos los comentarios disponible dentro de un artículo.

¡Alerta!

Todos los ejemplos usados en el tutorial de son una continuación de los ejemplos del capitulo anterior.


¿Como crear una asociación o relación de base de datos en Django?

Lo primero que tenemos que hacer para definir una relación de base de datos en Django es crear dos modelos que puedan ser asociados uno con el otro, en nuestro caso ya poseemos uno, el modelo articulo, solo nos faltaría el segundo. Veamos como crearlo:

Agreguemos al archivo models.py que se encuentra en la app blog el siguiente código:

class Comentario(models.Model): nombre = models.CharField(max_length = 200) cuerpo = models.TextField() fecha_pub = models.DateTimeField('fecha publicacion') articulo = models.ForeignKey(Articulo)

12345 classComentario(modelsModel):   nombre=modelsCharField(max_length=200)   cuerpo=modelsTextField()   fecha_pub=modelsDateTimeField('fecha publicacion')   articulo=modelsForeignKey(Articulo)

Observemos lo siguiente:

  • Creamos un modelo llamado Comentario, el cual va a guardar todos los comentarios realizados a un artículo.
  • Con nombre = models.CharField(max_length = 200) guardamos el nombre de la persona que realizo el comentario.
  • Con cuerpo = models.TextField() guardamos el cuerpo del comentario.
  • Con fecha_pub = models.DateTimeField('fecha publicacion') guardamos la fecha en que es publicado dicho comentario
  • Con articulo = models.ForeignKey(Articulo) guardamos la relación que existe entre el articulo y el **comentario

Si no sabes como crear un modelo en Django te recomiendo que le eches un ojo a Modelos en Django.

Cabe resaltar que existen diferentes maneras de crear relaciones de bases de datos dentro del framework de Django, veamos las más importantes:

  • Muchos a uno: Para definir este tipo de relación usamos ForeignKey(). Sirve para asociar un modelo a muchos modelos diferentes (1:n). Ejemplo: una marca de carros posee varios carros.
  • Muchos a muchos: Para definir este tipo de relación usamos ManyToManyField(). Sirve para asociar varios modelos a muchos modelos diferentes (n:n). Ejemplo: diferentes pizzas poseen diferentes toppings.

En el ejemplo de los comentarios estamos usando la asociación (1:n).

Si quieres saber mas acerca de los tipos de asociaciones que puedes realizar en Django te recomiendo que visites Relaciones de modelos en Django.

Una vez que realicemos la asociación debemos permitir la manera que el usuario pueda hacer uso de dicha asociación. Veamos como:

Lo primero que tenemos que hacer es crear un form para dicho modelo, para realizar esto vamos a agregar el siguiente código al archivo forms.py dentro de nuestra app:

class ComentarioForm(forms.ModelForm): class Meta: model = Comentario fields = ('nombre', ‘cuerpo')

12345 classComentarioForm(formsModelForm):    classMeta:  model=Comentario  fields=('nombre',cuerpo')

Observemos que creamos un form para el modelo Comentario con la ayuda de Django. Con model = Comentario asignamos el modelo correspondiente al form que queremos desplegar y con fields = ( ‘nombre’, ‘cuerpo’ ) le indicamos a Django que solo puede mostrar estos campos en vez de todos los que restan en el modelo.

Si no sabes como crear un form o formularios en Django te recomiendo que le eches un ojo a Formularios en Django.

Ahora lo que tenemos que hacer es agregar un url para que podamos acceder a la vista de crear los comentarios. Para esto necesitamos agregar lo siguiente al archivo urls.py dentro de la app blog:

url(r'^agregar_comentario/(?P<articulo_id>\d+)/$', 'blog.views.agregar_comentario'),

1   url(r'^agregar_comentario/(?P<articulo_id>\d+)/$','blog.views.agregar_comentario'),

Si no sabes como crear urls en Django te recomiendo que le eches un ojo a Urls en Django.

Seguido a esto debemos crear la vista a la cual va a acceder el la url que creamos anteriormente para eso agregamos el siguiente código al archivo views.py en la app blog:

def agregar_comentario(request, articulo_id): articulo = Articulo.objects.get(id=articulo_id) if request.POST: form = ComentarioForm(request.POST) if form.is_valid(): comentario = form.save(commit=False) comentario.fecha_pub = timezone.now() comentario.articulo = articulo comentario.save() return HttpResponseRedirect('/articulos/obtener/%s' % articulo_id) else: form = ComentarioForm() args = {} args.update(csrf(request)) args['articulo'] = articulo args['form'] = form return render_to_response('agregar_comentario.html', args)

123456789101112131415161718192021222324 def agregar_comentario(request,articulo_id):  articulo=Articuloobjectsget(id=articulo_id)   ifrequestPOST:  form=ComentarioForm(requestPOST)  ifformis_valid():  comentario=formsave(commit=False)   comentariofecha_pub=timezonenow()  comentarioarticulo=articulo   comentariosave()   returnHttpResponseRedirect('/articulos/obtener/%s'%articulo_id)  else:  form=ComentarioForm()     args={}  argsupdate(csrf(request))    args['articulo']=articulo  args['form']=form   returnrender_to_response('agregar_comentario.html',args)

Observemos lo siguiente:

  • Con articulo = Articulo.objects.get(id=articulo_id) estamos obteniendo el articulo con el id que provee la url, es decir, el artículo al cual debemos agregar el comentario.
  • Con comentario = form.save(commit=False) guardamos la instancia del comentario una vez que sea valida pero no le hacemos commit, es decir, no la guardamos en la base de datos.
  • Con comentario.fecha_pub = timezone.now() asignamos la hora cuando creamos el comentario.
  • Con comentario.articulo = articulo asignamos el articulo al comentario.
  • Con comentario.save() guardamos todo en la base de datos.
  • Y finalmente redirigimos a obtener el artículo al cual le agregamos el comentario.

Si no sabes como crear una vista en Django te recomiendo que le eches un ojo a Vistas en Django.

Hasta acá vamos a llegar con el tutorial de hoy, en el próximo capitulo terminaremos de ver como crear el template o la plantilla necesaria para crear el comentario, agregaremos un botón el cual nos va a permitir desde el artículo agregar los comentarios y por ultimo, veremos como desplegar todos los comentarios disponible dentro de un artículo.


Conclusión

En esta lección, aprendimos como crear asociaciones en las bases de datos con la ayuda de Django, como crear el formulario para rellenar dicha asociación, como definir el url que nos va ayudar a crear las asociaciones y finalmente como crear la vista la cual va a procesar la información que guardemos en dicho formulario. Si tienes alguna pregunta, yo estaré feliz de responderte en los comentarios, además espero que te unas y le eches un vistazo a todo el resto de este curso.

¡Te espero la próxima semana con la Parte II!


Volver a la Portada de Logo Paperblog

Dossier Paperblog