2009-10-17 7 views
2

J'essaye de créer un modèle pour le site d'article. Je veux lier chaque article avec 3-5 articles connexes, donc ce que je pense est la création de code de cette façon:Django: Faire un modèle avec un nombre indéfini de champs

class Article (models.Model): 
    # Tiny url 
    url = models.CharField(max_length = 30, unique=True) 
    is_published = models.BooleanField() 
    author = models.CharField(max_length = 150) 
    title = models.CharField(max_length = 200) 
    short_description = models.TextField(max_length = 600) 
    body = tinymce_models.HTMLField() 
    related1 = models.ForeignKey(Article) 
    related2 = models.ForeignKey(Article) 
    related3 = models.ForeignKey(Article) 

Mais pas sûr s'il est possible de faire une relation clé étrangère sur le même modèle. Aussi si par exemple, je vais décider de lier 6, 7 articles ensemble, comment cela va fonctionner, dois-je écrire related4, 5, 6 .... dans le modèle? Je veux avoir une solution plus commune, donc si je lie plus d'articles, je n'ai pas besoin de redéfinir le code encore et encore

Ce à quoi je pense n'est pas d'étendre les modèles d'article avec des domaines connexes .. (Il semble moche Peut-être cela vaut-il la peine de créer un autre modèle? Par exemple: ArticleSet

Mais comment y définir une liste sans restriction (sans limite d'éléments) .. Pourriez-vous suggérer un moyen?

Merci à l'avance

Répondre

5

Vous devez utiliser un ManyToManyField pour cette relation.

Par exemple:

class Article (models.Model): 
    # rest of fields up to and including body 
    related_articles = models.ManyToManyField("self") 
+0

Existe-t-il un moyen de limiter la quantité par exemple à 5 dans ce cas? –

+0

Juste essayé :) C'est vraiment cool! Je me demande comment puis-je interroger tous les articles liés à l'actuel dans une vue? Aussi serait vraiment bon de filtrer la liste des articles connexes disponibles en quelque sorte :( –

+0

Je ne sais pas si la mise en forme fonctionnera ici ...
{% pour rel_art dans cur_art.related_articles%}
& lta href = "{ {rel_art.url}} "> {{rel_art.title}} & lt/a>
{% endfor%} –

4

Fondamentalement, le ManyToMany peut être considérée comme un tableau. Ainsi, dans le modèle que vous pouvez faire quelque chose comme ceci:

{% for rel_art in cur_art.related_articles.all %} 
    <a href="{{rel_art.url}}">{{rel_art.title}}</a> 
{% endfor %} 

Sur une note plus générale, le Django docs (et Django Book gratuit en ligne) sont à peu près aussi bon qu'il obtient dans Fossland. Je recommande fortement de prendre une bonne tasse de café et de faire des lectures sérieuses. Il y a aussi beaucoup de bonnes choses à apprendre en lisant le code de Django lui-même - c'est bien structuré et bien commenté. Même en passant par une application simple comme django.contrib.flatpages vous donnera un réel aperçu de ce que vous pouvez faire avec.

+0

Merci pour en ajoutant le '.all', Carl, je travaillais avec un one-beer-handicap. –

Questions connexes