2009-06-25 6 views
0

J'ai un projet avec une application FAQ. L'application a des modèles pour FAQ (écrit par les auteurs du site) et UserFAQ (écrit par les utilisateurs - pas seulement un nom intelligent). Je souhaite renvoyer toutes les entrées, FAQ ou UserFAQ correspondant à certaines conditions, mais je souhaite également exclure les UserFAQ ne correspondant pas à certains critères. Idéalement, il serait ressemble:Filtrage d'une classe et d'une sous-classe dans Django

faqs = FAQ.objects.filter(question__icontains=search).exclude(show_on_site=False) 

Où « show_on_site » est une propriété que seuls les objets ont UserFAQ. Cela ne fonctionne pas parce que le filtre craps sur la classe parente car il ne possède pas la propriété. Quelle est la meilleure façon de faire cela? Je suis tombé sur this snippet, mais il semble que c'est trop pour ce que je veux faire.

Répondre

1

Dans votre position, sans besoin d'avoir deux tables, je serais tenté d'avoir un modèle/tableau FAQ avec les champs is_user_faq et show_on_site.

Parfois, il est utile lors de la modélisation de données de l'organiser pour un accès simple et rapide. Bien que l'héritage du modèle ait un certain attrait, j'ai trouvé qu'il est souvent plus facile d'éviter de l'utiliser.

+0

Je ne me soucie vraiment pas de cette réponse. Si la meilleure solution dans un cadre est de casser les principes de la POO, ce serait un mauvais cadre. On dirait qu'il y a une solution à cela dans Django 1.1. Je cherche juste un moyen de filtrer certains éléments d'un jeu de requête; briser la conception des objets ne peut pas être la meilleure solution. – Tom

+2

@Tom Attention aux mots comme "pause". Vous essayez de mapper une conception OO à un magasin de données relationnel (qui n'est pas OO). C'est fondamentalement une chose difficile à faire, et l'abstraction fuit. Vous pouvez préférer la conception basée sur l'héritage pour vos objets métier, mais les redéfinir de manière à les lier plus étroitement au magasin de données ne "brise pas la conception", mais utilise un design différent qui présente des avantages différents (par exemple, cela signifie tu te cognes la tête contre les limitations de l'ORM beaucoup moins). Ne pas dire qu'il n'y a pas moyen de le faire à votre façon, mais c'est une réponse tout à fait raisonnable. –

Questions connexes