2010-05-01 11 views
1

Je rencontre des problèmes pour trouver la meilleure façon de faire ceci. Je crée quelque chose comme un manuel interactif. Il a des modules, qui sont plus ou moins comme des chapitres. Chaque page de module doit répertorier les rubriques de ce module, regroupées en sections.Liste manuelle d'objets dans Django (problème avec l'ordre des champs)

Ma question est comment je peux m'assurer qu'ils listent dans le bon ordre dans le modèle? Plus précisément:

1) Comment s'assurer que les sections apparaissent dans le bon ordre?
2) Comment s'assurer que les sujets apparaissent dans le bon ordre dans la section? J'imagine que je pourrais ajouter un champ à chaque modèle uniquement pour le plaisir de commander, mais le problème est qu'un sujet peut apparaître dans différents modules, et quelle que soit la section dans laquelle ils se trouvent, ils devraient être de nouveau commandé en quelque sorte.

Je renoncerais probablement et ferais tout manuellement sans le fait que j'ai besoin d'avoir le sujet comme objet dans le gabarit (ou la vue) afin que je puisse le marquer en fonction de la façon dont l'utilisateur l'a étiqueté . Donc, je suppose que ma question est de savoir si je devrais créer les pages de contenu manuellement, ou s'il y a un moyen de classer les résultats de la requête d'une manière à laquelle je n'avais pas pensé. Merci de votre aide!

edit: La chose la plus simple que je puisse penser serait si je pouvais avoir une liste ordonnée (de sujets) dans le modèle de module ou de section, mais cela n'est pas possible. Est-ce? Peut-être avec un champ personnalisé?

+0

Y a-t-il un moyen de les commander en fonction des données existantes dans les tableaux? Ou est-ce que la commande dépend vraiment de la section? (Fournir des modèles dépouillés aiderait!) – KillianDS

+0

Il n'y a pas d'autres données dans les tableaux pour le faire. Pensez-y: si vous créez la table des matières d'un livre, vous n'avez pas nécessairement le moyen de classer les chapitres par leur contenu - vous les commandez simplement manuellement. Je fournirais le modèle Topic mais il est littéralement juste un charfield (son nom), et les pages qui s'y rapportent depuis leur fin via foreignkey. Le module et la section ne sont pas dans le modèle, parce que je n'ai besoin que d'eux pour exactement ce problème dont je parle. – Chris

Répondre

4

Ainsi, votre structure est essentiellement un module/une section/un sujet, et les rubriques peuvent apparaître dans plus d'une section.

Fondamentalement, vous voulez que ce (champs de contenu omis):

class Module(models.Model): 
    title = CharField(max_length=100) 

class Section(models.Model): 
    topics = ManyToManyField(Topic, related_name="sections", 
     through='TopicEntry') 
    module = models.ForeignKey(Module, related_name="sections") 

class Topic(models.Model): 
    text = models.TextField() 

class TopicEntry(models.Model): 
    section = models.ForeignKey(Section) 
    topic = models.ForeignKey(Topic) 
    order = models.IntegerField() 

Affichez Extra Fields on Many-to-Many Relationships pour plus d'informations sur ManyToManyField.through. Les docs ne sont cependant pas parfaitement clairs. Si je les lis correctement, pour obtenir votre table des matières, utilisez quelque chose comme:

topicList = Topic.objects.filter(section=section).order_by("TopicEntry__order") 
# Might be "topicEntry__order" or "topicentry__order" instead; the docs aren't 
# clear how it transforms the name of the intermediate model. 
# This also works: 
topicList = section.topics.all().order_by("TopicEntry__order") 
1

J'utilise une table dans votre base de données spécifiquement pour les sujets de la commande dans les modules, par exemple:

Topic | Module | Order 
A  | mod1 | 2 
B  | mod1 | 1 
C  | mod1 | 3 
C  | mod2 | 2 
A  | mod2 | 3 
B  | mod2 | 1 

Il ne peut pas être la meilleure méthode mais comment je l'ai résolu le problème dans ma propre application.

Pour commander les données, utilisez simplement .order_by ("field_name") à la fin de votre instruction model.objects.filter().

+0

J'aime cette solution, mais puis-je vraiment utiliser order_by comme ça? N'aurais-je pas besoin de me référer à la nouvelle table que j'utilise pour cette commande quelque part dans la requête? – Chris

+0

Vous devez avoir la table de commande liée au module et aux tables de sujet via des clés étrangères.Vous faites alors quelque chose comme: Mod = module.objects.get (module = "mod1") order.objects.filter (module = mod) .order_by ("commande"). Vous pouvez ensuite accéder aux rubriques via la clé étrangère dans chaque objet de commande. – danspants

+0

Ceci est également la meilleure solution, pour plus d'informations sur la façon de le faire correctement dans django, voir http://docs.djangoproject.com/fr/dev/topics/db/models/#extra-fields-on-many -to-many-relations – KillianDS

Questions connexes