2010-08-17 5 views
2

Je travaille avec des types de contenu dans feincms. Et je veux faire un type de contenu qui peut stocker des filtres dans la base de données. En gros, il ressemblerait à ceci:Filtres de modèle Django stockés dans la base de données

from news.models import Entry 
class NewsContent(models.Model): 
    filter = models.CharField() 
    exclude = models.CharField() 
    offset = models.IntegerField() 
    limit = models.IntegerField() 
    #template = models.CharField() 

    def get_entries(self): 
     return Entry.objects.filter(self.filter).exclude(self.exclude)[self.offset:self.limit_upper] 

Est-ce possible?

Maintenant, cela peut ou peut ne pas être une bonne idée de vitesse sage, mais c'est la question n ° 2

+0

Quelles seraient les exemples de valeurs de filtre ressembler? Je suppose que vous auriez à les analyser comme du code Python, ce qui serait une très, très mauvaise idée. –

+0

lol, je suis vraiment très tenté de le faire, puisque je serai le seul à y avoir accès. Mais qu'en est-il de sérialiser ou quelque chose comme ça? Peut-être que je peux faire des dictionnaires dans les filtres en quelque sorte ...:/ – demux

Répondre

2

Vous devriez être en mesure de le faire en utilisant un dictionnaire pour le filtre et exclure les champs.

que vous voulez ajouter ce filtre:

...filter(one='asdf', two='xyz') 

alors vous stocker

"{'one':'asdf', 'two':'xyz'}" 

comme une chaîne dans votre champ de filtre de votre NewsContentModel.

alors vous pouvez le faire

def get_entries(self): 
    return Entry.objects.filter(**eval(self.filter)) 

Je pense qu'il faut travailler ...

+0

Il ya toujours le problème de sécurité avec eval. Mais vous dites ceci: ... filter ({one: 'asdf', deux: 'xyz'}) fonctionnerait réellement? – demux

+0

filter ({'one': 'asdf', 'two': 'xyz'}) ne fonctionnerait pas, mais filter (** {'one': 'asdf', 'two': 'xyz'}) would. Chaque fois que vous "évaluez" quelque chose que vous ne faites pas confiance, il y a un risque ... –

+0

... aussi, vous pouvez utiliser pickle pour sérialiser/désérialiser votre dictionnaire de filtre si vous voulez éviter d'utiliser eval. –

Questions connexes