2009-07-24 4 views
1

Je suis nouveau sur python/django. J'ai besoin de stocker un nombre arbitraire de champs dans un modèle django. Je me demande si django a quelque chose qui s'occupe de ça.Comment stocker un nombre arbitraire de champs dans le modèle django?

En règle générale, je voudrais stocker du code XML dans une colonne pour ce faire. Est-ce que django offre des classes qui facilitent cela, qu'il s'agisse de XML ou d'une autre (meilleure) méthode?

Merci, Pete

+0

Il peut également être intéressant de noter qu'à l'avenir, nous aurons peut-être le choix d'adaptateurs NoSQL à utiliser dans Django. Google a ajouté la prise en charge de BigTable sur appengine, et un premier travail a été effectué sur un adaptateur CouchDB. – sixthgear

Répondre

11

Il y a beaucoup d'approches pour résoudre ce problème, et en fonction de votre situation un d'entre eux pourraient travailler. Vous pouvez certainement utiliser un TextField pour stocker XML ou JSON ou toute autre forme de texte. En combinaison avec la fonction pickle de Python, vous pouvez faire quelques trucs plus propres.

Vous pouvez regarder Django Pickle définition terrain sur DjangoSnippets: http://www.djangosnippets.org/snippets/513/

qui vous permet de vider les dictionnaires Python dans les champs et fait quelques manipulations de sorte que lorsque vous faites référence à ces champs, vous pouvez obtenir un accès facile aux dictionnaires sans avoir besoin de ré-analyser XML ou quoi que ce soit.

J'imagine que vous pourriez également explorer l'écriture d'une définition de champ personnalisée qui ferait la même chose pour d'autres formats de sérialisation, bien que je ne sois pas sûr de son utilité.

Ou vous pouvez simplement refactoriser votre modèle pour profiter des champs ManyToMany. Vous pouvez créer un modèle pour une clé générique, une paire de valeurs, puis sur votre modèle principal, une référence M2M pour cette clé générique, modèle de valeur. De cette façon, vous pouvez tirer parti de plus de Django ORM aux données de référence, etc.

+0

Très bonne réponse présentant de nombreuses options, merci! – slypete

+0

+1 pour moi en tapant une longue réponse, sachant que vous l'avez dit mieux et plus clair, puis en supprimant cette réponse. – sixthgear

+0

Cela m'a appris quelque chose que je ne savais pas qui serait très utile! –

0

Il y a un champ XML disponible: http://docs.djangoproject.com/en/dev/ref/models/fields/#xmlfield

Mais il vous oblige à faire l'analyse syntaxique supplémentaire sur la requête résultant. (Ce que je pense que vous aurez à faire dans une certaine mesure ...)

J'ai considéré juste jeter une liste, unicode (mycolumnlist), dans un seul champ char et ayant juste un nombre défini de charfields indexés après comme:

class DumbFlexModel(models.Model): 
    available_fields = models.CharField() 
    field1 = models.CharField() 
    field2 = models.CharField() 
    field3 = models.CharField() 
    ... 

de cette façon, vous pourriez au moins effectuer une requête contient sur available_fields pour filtrer les résultats à seulement ceux avec le champ que vous essayez d'obtenir Vaules pour, mais la position est arbitraire, donc vous devriez doivent encore passer par chaque résultat et le processus available_fields obtenir la position de la valeur.

Ou peut-être le dumping d'une liste de dictionnaires sérialisés (pickle.dumps())?

Je suis intéressé par d'autres suggestions.

Questions connexes