PJBlog : Pierre-Jean, WinLibre et Cie...

Pierre-Jean Coudert - Logiciels Libres - Développement - etc...

Aller au contenu | Aller au menu | Aller à la recherche

mercredi, juin 22 2011

Nettoyer / Supprimer / Remettre à zéro les migrations de South

Cette note est un aide-mémoire personnel.

Au cours de l avie d'un développement Django, Il est souvent souhaitable de remttre à zéro les migrations gérées par South.

Voici la liste des commandes à lancer (ici avec linux).

./manage.py reset south
rm -r appname/migrations/
./manage.py convert_to_south appname

Attention, la commande "reset south" supprime les enregistrement des migrations pour toutes les applications. Il faut donc effectuer les deux autres commandes sur l'ensemble des applications

samedi, janvier 29 2011

How to use South to migrate models in a multiple databases Django project

Django 1.2 brings multiple databases handling through the use of database routers. The actual version of South (0.7.3) is not able to handle correctly multiple databases projects out of the box.

Here is a workaround: the idea is to create a new fake django project. And then to use South migration within this project.

 cd head_directory
 django-admin.py startproject my_south_db_project
 cd my_south_db_project

Next,edit my_south_db_project/settings.py

  • we have to set the path correctly to south, to your app and to the corresponding database
  • The only installed apps should be South and your app
 
 import sys
 import os.path
 ...  
 current_path = os.path.abspath(os.path.dirname(_ _file_ _))
 head, tail = os.path.split(current_path)
 sys.path.append(os.path.join(head, "my_db_app_dir"))
 sys.path.append(os.path.join(head, "south_sdir"))
 dbpath = os.path.join(head, "my_initial_project_dir")
 ...
 DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME' : os.path.join(dbpath,'my_db_app.sqlite')
       'USER': '',
       'PASSWORD': '',
       'HOST': '',
       'PORT': '',
   },
 }
 ...  
 INSTALLED_APPS = (
   'south',
   'my_db_app',)
 ...

Create south table in the new db

 ./manage.py syncdb

Now you can work in this project to manage your apps related to this new db

 manage.py convert_to_south my_db_app

on other computers

 manage.py migrate my_db_app 0001 --fake

modify models.py

 manage.py schemamigration my_db_app --auto
 manage.py migrate my_db_app

As you can see, this way you keep the standard South workflow !

Edit: I use this line in the main project's settings.py in order to be able to launch tests:

 SOUTH_TESTS_MIGRATE = False

lundi, janvier 3 2011

Astuce Django : Trier un Queryset après l'avoir slicé

Il est impossible de trier un queryset après en avoir extrait une tranche (slice).

Une solution simple consiste à utiliser la fonction python sorted associée à une lambda fonction pour la clé de tri :

model_unordered = Model.objects.all().order_by('-pub_date')[:100]
model_ordered= sorted(model_unordered, key=lambda obj: unicode(obj.textfield))

jeudi, novembre 4 2010

Fuites de mémoire avec Django

Je viens de trouver !

Une commande Django pour manage.py qui effectue une mise à jour complète d'une base de donnée, avait une occupation mémoire gigantesque. Après un debug intensif et de nombreux tests, impossible de comprendre ce qui clochait dans mon code.

C'est ce post qui m'a mis sur la voie : en mode DEBUG= True, Django mémorise l'ensemble des requêtes sur la base de donnée pendant la requête HTTP en cours... Mais il n'y a pas de requête HTTP pendant l'exécution de manage.py, donc tous mes appels à la base sont mémorisés par Django et encombrent la mémoire !

Il y a donc deux solutions à ce problème :

  1. positionner DEBUG= FALSE
  2. faire appel à db.reset_queries() régulièrement pour vider cette liste de requêtes. ( from django import db )

dimanche, septembre 27 2009

Django code snippets for Notepad++

Here is the content for my Quicktext.ini. This adds Django shortcuts to Notepad++ with the QuickText Plugin.

ie: type model + <TAB> to insert the following model's skeleton:


class ModelName(models.Model):
    """Model docstring"""
    slug = models.SlugField(max_length=200)
    name = models.CharField(max_length=100, default='name')

    updated = models.DateTimeField('update date', auto_now=True )
    created = models.DateTimeField('creation date', auto_now_add=True )

    class Meta:
        pass

    def __unicode__(self):
        return name

    def save(self, force_insert=False, force_update=False):
        pass

    @models.permalink
    def get_absolute_url(self):
       return ('view_or_url_name')


class ModelNameAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ['name',]

admin.site.register(ModelName, ModelNameAdmin)

Lire la suite...

jeudi, août 20 2009

Django SEO : Link Exchange

I've just published a Django SEO application : Django Link Exchange

This little Django SEO App enables you to manage deep links exchange.

You can edit directly with Django's admin the following informations:

  • Campaigns: site informations
  • Links : anchor, url, additional text
  • Links customization: specific css classes, target, additional javascript (ie: tracker)
  • BackLinks : url, anchor
  • Check Backlinks automatically via Admin's Action (I'm using http://code.google.com/p/scrapemark/ to analyze the backlinking page)

To Install this application, copy it in a directory which is on your PYTHONPATH.

Next, edit your project's settings. and add:

   INSTALLED_APPS += ('link_exchange')

In your template's files:

  • you can publish a link directly in the template with it's name
     {%load link_ex%}
     {%link "name"%}
  • you can publish a link through an object's field containing html AND the {%link "name"%} tag
     {%load link_ex%}
     {% autoescape off %}
     {%evaluate object.textfield%}
     {% endautoescape %}

lundi, mars 30 2009

10 liens indispensables, en français, pour bien développer avec Django

Le camp de base

  • Django-fr : Pour commencer, LE site sur Django pour les francophones

Apprendre

Documentation et Référence

Bonne pratiques

Installer Django sur un serveur

Réutiliser des application existantes

Et pour finir, un site anglophone mais non des moindres

  • Django snippets : Le recueil de tous les extraits de codes utiles dont vous pourrez avoir besoin lors d'un développement Django.

jeudi, février 19 2009

Ecoles de ski, Django, Fixtures et champs ManyToMany...

Après avoir galéré sur les fixtures django sur les champs ManyToMany, j'ai pu mettre en ligne la mise à jour de la base de données de Resaski.

Voici un modèle simplifié :

class Language(models.Model):
  code = models.SlugField(primary_key=True, max_length=10)
  name = models.CharField(max_length=200)

class School(models.Model):
  slug = models.SlugField(primary_key=True, max_length=200)
  languages = models.ManyToManyField(Language)

et un ensemble de fixtures json associé :

[
 {"model": "myapp.language",
  "pk":"fr",
  "fields":{"name": "Français","code": "fr"}
 },
 {"model": "myapp.language",
  "pk":"en",
  "fields":{"name": "Anglais","code": "en"}
 },
 {"model": "myapp.School",
  "pk":"ecole-1",
  "fields":{"slug":"ecole-1", "languages":[fr]}
 },
 {"model": "myapp.School",
  "pk":"ecole-2",
  "fields":{"slug":"ecole-2", "languages":["fr","en"]}
 }
]

L'ensemble des stations et des écoles de ski à été mis à jour, notamment  : Ecole de ski Tourmalet Risoul Le Grand Bornand Morzine Saint Gervais La Rosière Les Carroz d'Arraches Valloire Contamines Montjoie Les Gets Vars - Crevoux Valmorel Serre Chevalier Samoëns Châtel Megève Vos cours de snowboard à La Clusaz Les Saisies Les Menuires Val d'Isère Alpe d'Huez Vos cours de ski sur Avoriaz Les Deux Alpes Meribel La Plagne Ecole de ski Courchevel Chamonix Les Arcs Val Thorens Les écoles de ski à Tignes

mardi, juin 5 2007

Tutoriel : Installation de Django sous Windows

Vous voulez gouter aux joies du développement web en Python avec un des meilleurs Framework actuel ?

Voici un petit tutoriel en pas à pas pour installer Django sur votre PC sous Windows:

  1. Télécharger et installer Python
  2. Télécharger et installer Tortoise SVN
  3. Créer un dossier "django" où bon vous semble et récupérer la dernière version du code Django depuis le serveur Subversion :
    • cliquer avec le bouton droit sur votre dossier "django"
    • choisissez "SVN checkout..."
    • Copier l'adresse "http://code.djangoproject.com/svn/django/trunk/" dans le champ "URL of repository:"
    • Valider pour charger la dernière version du code django
  4. Modifier la variable d'environnement "Path" :
    • Aller dans le panneau de configuration
    • cliquer sur l'icone "Système"
    • dans l'onglet "Avancé" cliquer le bouton "Variables d'environnement"
    • dans la boite double cliquer sur la variable "Path"
    • ajouter ;C:\Python25;C:\Python25\Lib\site-packages\django\bin à la valeur de la variable
  5. Nous allons maintenant installer django
    • ouvrir une ligne de commande "Menu Démarrer > Accessoires > Ligne de Commande"
    • taper "cd vers_votre_repertoire\django"
    • taper "python setup.py install"
    • django est installé
  6. Installer Mysql
  7. Installer mysql-python

Tout est maintenant installé !

Vous pouvez commencer à vous amuser : http://www.djangoproject.com/documentation/

Les liens indispensables