2011-01-16 4 views
2

J'ai un modèle qui a un jeu de cordes mariné. (Il doit être décapé, parce que Django n'a pas construit dans le champ de jeu, non?)Django Admin interface avec décapage

class Foo(models.Model): 

    __bar = models.TextField(default=lambda: cPickle.dumps(set()), primary_key=True) 

    def get_bar(self): 
     return cPickle.loads(str(self.__bar)) 

    def set_bar(self, values): 
     self.__bar = cPickle.dumps(values) 

    bar = property(get_bar, set_bar) 

Je voudrais l'ensemble être modifiable dans l'interface d'administration. Évidemment, l'utilisateur ne travaillera pas directement avec la chaîne décapée. En outre, l'interface aurait besoin d'un widget pour ajouter/supprimer des chaînes d'un ensemble.

Quelle est la meilleure façon de procéder? Je ne connais pas très bien le système d'administration de Django. Ai-je besoin de créer un widget d'administration personnalisé ou quelque chose?

Mise à jour: Si je besoin d'un widget personnalisé, cela semble utile: http://www.fictitiousnonsense.com/archives/22

Mise à jour 2: Maintenant, je suis à la recherche à travers différents modèles relationnels pour voir si cela fonctionnera. Une idée que je suis jouer avec:

class FooMember(models.Model): 
     name = models.CharField(max_length=120) 
     foo = models.ForeignKey('Foo') 

class Foo(models.Model): 
     def get_names(self): 
      return FooMember.objects.filter(foo__exact=self) 

Les inconvénients de ce comprennent:

  • Il se sent excessive de faire un modèle entier pour un champ de données (name).
  • Je voudrais l'interface d'administration pour Foo pour permettre à l'utilisateur d'entrer une liste de chaînes. Je ne suis pas sûr de savoir comment faire avec cette configuration; faire un widget de forme personnalisée semble moins de travail.
+0

Un objet ManyToManyField est similaire à un ensemble. Pourriez-vous faire vos champs 'uniques = True' dans un autre modèle, et inclure un ManyToManyField de ce modèle dans Foo? –

+0

"Il semble excessif de créer un modèle complet pour un champ de données (nom)" --- cela se ressent, mais ce ne sont que des lignes dans une table de base de données. – osa

Répondre

3

Uhm. Django stocke généralement ses données dans une base de données SQL. Stocker un ensemble en tant que chaîne décapée n'est certainement pas la meilleure façon d'utiliser une base de données SQL. Ce n'est pas immédiatement évident quelle est la bonne solution dans votre cas, cela dépend de ce qui est dans cet ensemble, mais c'est la mauvaise solution dans tous les cas.

Vous pouvez vouloir une nouvelle table pour cet ensemble, ou au moins l'enregistrer en tant que valeurs séparées par des virgules ou quelque chose.

+0

Pouvez-vous expliquer pourquoi c'est la mauvaise approche? L'ensemble n'aura jamais plus de ~ 10 éléments, donc je n'ai pas besoin de temps de recherche rapide. De plus, quel avantage le CSV a-t-il sur le marinage? (en dehors de se plaindre plus si l'article que je décapage n'est pas un ensemble.) –

+0

L'avantage de CSV est que vous pouvez le lire même si vous n'avez pas python autour. Si vous voulez tout dans les cornichons, essayez ZODB une base de données orientée objet basée sur les cornichons qui est assez génial. C'est une mauvaise approche car elle utilise la base de données SQL que vous avez, elle n'est pas portable, elle est compliquée à mettre en œuvre, fragile et sujette à rupture. Il n'y a rien de convaincant à ce sujet. –