J'ai installé comme si (changé pour la simplicité)Handling modèles associés à Django pour une utilisation dans Django-piston
class Author(models.Model)
name = models.CharField(max_length=100)
...
class Document(models.Model):
title = models.CharField(max_length=200)
content - models.TextField()
author = models.ForeignKey("Author", related_name="documents")
date_published = models.DateTimeField()
categories = models.ManyToManyField("Category")
class Category(models.Model):
name = models.CharField(max_length=100)
Je tire dans les dossiers de l'auteur, mais je veux seulement tirer dans les dossiers de documents connexes pour chaque auteur qui correspond à des critères spécifiques - disons, date_published et category.
Je sais que le moyen facile de le faire serait de tirer dans les dossiers comme une liste de dictionnaires en utilisant Author.objects.values()
, une boucle à travers chaque enregistrement et le fonctionnement:
author['documents']=Document.objects.filter(categories__in=[category_list], date_published__year=year)`
Cependant, cela est généré pour django- piston, et il semble être le plus heureux (surtout si vous définissez vos propres champs!) si vous renvoyez un objet QuerySet.
Une partie de ceci peut être parce que j'ai fait des changements au code de base django-piston. Fondamentalement, le current version of the code écrase ici la valeur fields
. J'ai changé ce code afin que je puisse changer la valeur fields
pour un gestionnaire basé sur la demande (ainsi je pourrais fournir plus de détails si la demande était pour une ressource spécifique).
donc je suppose que ma question est triple:
- Y at-il un moyen de filtrer ou d'une certaine façon de limiter les sous-enregistrements d'un enregistrement (ie filtre
documents
pour chaqueauthor.documents
) - Dans le cas contraire, ce qui est une façon fonctionnelle de faire cela qui fonctionne également avec django-piston?
- Existe-t-il une façon plus simple et plus efficace de faire ce que j'essaie de faire (afficher tous les auteurs sans leurs documents si un identifiant n'est pas donné, mais afficher les sous-enregistrements si filtrage vers un seul auteur)?
Précision
D'accord, juste pour être clair, voici le pseudocode que je veux:
def perhaps_impossible_view(request, categories=None, year=None):
authors = Author.objects.all()
authors.something_magical_happens_to_documents(category__in=[categories], date_published__year=year)
return render_to_response('blar.html', locals(), RequestContext(request))
Alors que si je étaient à mettre dans un modèle, cela fonctionnerait sans aucune modification:
{% for a in authors %}
{% for d in authors.documents.all %}
{{ d.title }} is almost certainly in one of these categories: {{ categories }} and was absolutely published in {{ year }}. If not, .something_magical_happens_to_documents didn't work.
{% endfor %}
{% endfor %}
something_magical_happens_to_documents
doit courir et réellement changer le contenu de documents
pour chaque enregistrement d'auteur. Il semble que cela devrait être possible, mais peut-être pas?
Ce ne filtre que les enregistrements de l'auteur, qui n'est pas l'effet désiré. John, Sally et Maria écrivent chacun 100 docs, John a 10 documents correspondants, Sally 8, Maria 0. Avec votre requête, seulement John et Sally viendraient, et pour chaque 'author.documents.count()' serait encore 100. Je veux que John, Sally et Maria viennent, et 'author.documents.count()' devrait être 10, 8 et 0, respectivement. Je soupçonne qu'il y a un hack qui vous permet de définir ceci si vous êtes prêt à jouer avec les internes d'un objet QuerySet. –
@Jordan, True pour les auteurs sans correspondance manquants (c'est un filtre donc ils sont supprimés bien sûr) mais le nombre de documents ne fonctionne pas parce que vous n'utilisez pas le jeu de requête pour trouver le nombre de documents. Comme le commentaire est trop long et nécessite du code, j'ai édité la réponse. – laurent
@Jordan, 'author.documents.count()' retournera toujours 100 sauf si vous modifiez les données car il s'agit d'une nouvelle requête sans filtrage – laurent