"…mais ce serait peut-être l'une des plus grandes opportunités manquées de notre époque si le logiciel libre ne libérait rien d'autre que du code…"

Une application Web Django : le modèle ORM

Posted by patrick sur juillet 18, 2007

Avant d’aborder la méthode HTTP ‘POST‘ je vais regarder rapidement le modèle ORM de Django.

Pourquoi ?

  1. Par simple curiosité🙂
  2. parce qu’en relisant le tutoriel 01, j’ai vu que l’on pouvait manipuler les objets de la base de données avec une notation objet
  3. parce qu’hier je n’ai pas pu faire ceci dans le fichier bookmarks/template/bookmark/details.html

{% for tag in bookmark.tags %}
<li>{{tag.name}} </li>
{% endfor %}

On a bseoin de la documentation suivante:

http://www.djangoproject.com/documentation/db-api/

http://www.djangoproject.com/documentation/tutorial01/

Sous le répertoire cygwin : /cygdrive/e/projets/pybookmarks on lance la commande suivante:

$ python manage.py shell
Python 2.5.1 (r251:54863, Jun 19 2007, 22:55:07)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type « help », « copyright », « credits » or « license » for more information.
(InteractiveConsole)
>>>

On se retrouve donc sous l’interpréteur Python mais on va voir qu’on a également accès aux objets de la base de données sqlite. Je rappelle le modèle de données utilisé qui est dans le fichier /cygdrive/e/projets/pybookmarks/bookmarks/models.py:

class Tag(models.Model):    name = models.SlugField(maxlength=100)

def __unicode__(self):

return self.name

    class Admin:

pass

class Bookmark(models.Model):

user = models.ForeignKey(User)

url = models.URLField(db_index=True)

short_description = models.CharField(maxlength=255)

long_description = models.TextField(blank=True)

timestamp = models.DateTimeField(default=datetime.datetime.now)

public = models.BooleanField()

tags = models.ManyToManyField(Tag)

def __unicode__(self):

return self.url

class Admin:

pass

Voyons les requêtes que l’on peut faire en ligne de commande.

>>> import datetime
>>> from bookmarks.models import Bookmark, Tag
>>> from django.contrib.auth.models import User

>>> from django.shortcuts import get_object_or_404
>>> dir(Bookmark)
[‘AddManipulator’, ‘ChangeManipulator’, ‘DoesNotExist’, ‘__class__’, ‘__delattr_ _’, ‘__dict__’, ‘__doc__’, ‘__eq__’, ‘__getattribute__’, ‘__hash__’, ‘__init__’, ‘__metaclass__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex_ _’, ‘__repr__’, ‘__setattr__’, ‘__str__’, ‘__unicode__’, ‘__weakref__’, ‘_collec t_sub_objects’, ‘_default_manager’, ‘_get_FIELD_display’, ‘_get_FIELD_filename’, ‘_get_FIELD_height’, ‘_get_FIELD_size’, ‘_get_FIELD_url’, ‘_get_FIELD_width’, ‘ _get_image_dimensions’, ‘_get_next_or_previous_by_FIELD’, ‘_get_next_or_previous _in_order’, ‘_get_pk_val’, ‘_meta’, ‘_prepare’, ‘_save_FIELD_file’, ‘add_to_class’, ‘delete’, ‘get_next_by_timestamp’, ‘get_previous_by_timestamp’, ‘objects‘, ‘ save‘, ‘tags‘, ‘user’, ‘validate’]
>>> Bookmark.objects.all()
[<Bookmark: http://www.python.org&gt;, <Bookmark: http://gump.apache.org/index.html&gt;, <Bookmark: http://www.chomsky.info/&gt;, <Bookmark: http://www.chomsky.info/audi onvideo.htm>, <Bookmark: http://people.csail.mit.edu/meyer/iandc-WWW/Authors/chomskynoam.html>%5D

>>> b = get_object_or_404(Bookmark, pk=3)

>>> dir(b)
[‘AddManipulator’, ‘ChangeManipulator’, ‘DoesNotExist’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__doc__’, ‘__eq__’, ‘__getattribute__’, ‘__hash__’, ‘__init__’, ‘__metaclass__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__str__’, ‘__unicode__’, ‘__weakref__’, ‘_collect_sub_objects’, ‘_default_manager’, ‘_get_FIELD_display’, ‘_get_FIELD_filename’, ‘_get_FIELD_height’, ‘_get_FIELD_size’, ‘_get_FIELD_url’, ‘_get_FIELD_width’, ‘
_get_image_dimensions’, ‘_get_next_or_previous_by_FIELD’, ‘_get_next_or_previous_in_order’, ‘_get_pk_val’, ‘_meta’, ‘_prepare’, ‘_save_FIELD_file’, ‘add_to_class’, ‘delete’, ‘get_next_by_timestamp’, ‘get_previous_by_timestamp’, ‘id’, ‘long_description’, ‘objects’, ‘public’, ‘save’, ‘short_description’, ‘tags’, ‘timestamp’, ‘url’, ‘user’, ‘user_id’, ‘validate’]

>>> b.__metaclass__
<class ‘django.db.models.base.ModelBase’>


>>> b.tags
<django.db.models.fields.related.ManyRelatedManager object at 0x7fc0644c>
>>> dir(b.tags)
[‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__doc__’, ‘__getattribute__’, ‘__hash_, _’, ‘__init__’, ‘__module__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__str__’, ‘__weakref__’, ‘_add_items’, ‘_clear_items’, ‘_pk_val’, ‘_remove_items’, ‘add’, ‘all’, ‘clear’, ‘complex_filter’, ‘contribute_to_class’, ‘core_filters’, ‘count’, ‘create’, ‘creation_counter’, ‘dates’, ‘distinct’, ‘exclude’, ‘extra’, ‘filter’, ‘get’, ‘get_empty_query_set’, ‘get_or_create’,’get_query_set’, ‘in_bulk’, ‘instance’, ‘iterator’, ‘join_table’, ‘latest’, ‘model’, ‘none’, ‘order_by’, ‘remove’, ‘select_related’, ‘source_col_name’, ‘symmetrical’, ‘target_col_name’, ‘values‘]
>>> b.tags.values()
[{‘id’: 2, ‘name’: u’django’}, {‘id’: 3, ‘name’: u’chomsky’}]

OK, c’est ce que je cherchais donc les modifications sont les suivantes:

  • Dans le fichier details.html

{% if mark %}
<ul>
<li> {{mark.url}} </li>
<li> {{mark.user}} </li>
{# <li> {{mark.long_description}} </li> #}
<ul>
{% for tag in tags %}
<li>{{tag.name}} </li>
{% endfor %}
</ul>
</ul>
{% else %}
<p>pas de bookmark.</p>
{% endif %}

  • dans le fichier views.py

c=Context({‘mark’: bookmark,’tags’: bookmark.tags.values()})

Pour information:

– un nouvel ORM python vient de sortir: c’est storm (https://storm.canonical.com/FrontPage)

Lu sur la liste https://lists.ubuntu.com/mailman/listinfo/storm

I’ve started to experiment a little bit exploring whether storm can be used inside of Django. Django has feature to decouple the column names used in the database from the attribute names used when accessing the ORM in python, such as:

class DjangoModel(meta.Model):    bla = IntegerField(db_column="foo")

The equivalent in Storm is:

class MyClass(object):    bla = Int("foo")

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

 
%d blogueurs aiment cette page :