2010-06-14 5 views
0

Si j'ai des requêtes sur plusieurs tables comme:django rejoignent QuerySets de plusieurs tables

d = Relations.objects.filter(follow = request.user).filter(date_follow__lt = last_checked) 
r = Reply.objects.filter(reply_to = request.user).filter(date_reply__lt = last_checked) 
article = New.objects.filter(created_by = request.user) 
vote = Vote.objects.filter(voted = article).filter(date__lt = last_checked) 

et je veux afficher les résultats de tous triés par date (je ne parle pas de toutes les réponses, toutes les votes, etc.). D'une certaine manière, je veux «joindre tous ces résultats», dans un seul jeu de requête. Est-ce possible?

+0

Pouvez-vous dire pourquoi vous voulez faire cela? Nous pouvons vous fournir une autre solution ... – sebpiq

+0

parce que: 1.j'ai une liste de notification, et je veux afficher toutes les 'nouvelles notifications' pour un utilisateur, dans le même ordre que les événements ont eu lieu (je veux dire peut-être une réponse d'abord, puis un vote, etc.). aussi, je veux commander toutes ces notifications par jours (et il semble possible seulement si j'ai un ensemble de questions pour chacun d'entre eux). et 2. la deuxième raison - j'ai une fonction de recherche ailleurs, avec un jeu de requête dans le champ 'nom' de UserProfile, et je veux ajouter un paquetage pour 'nom d'utilisateur' pour la table utilisateur, afin qu'il puisse rechercher tous les deux. Merci beaucoup! – dana

+1

Je pense que si vous ne voulez pas changer l'architecture de vos modèles comme mentionné par Sébastien Piquemal, vous pouvez seulement mettre tous les objets dans une liste et les trier, mais pas avec un jeu de requête. –

Répondre

1

En plus au numéro de la proposition de Sébastien 2: Django a fait une fonctionnalité intégrée que vous pourriez « abus » pour cela; pour l'administrateur, il a déjà un modèle qui enregistre les actions de l'utilisateur et fait référence aux objets à travers une relation clé étrangère générique, je pense que vous pourriez juste sous-classe ce modèle et l'utiliser pour vos besoins:

from django.contrib.admin.models import LogEntry, ADDITION 
from django.utils.encoding import force_unicode 
from django.contrib.contenttypes.models import ContentType 

class MyLog(LogEntry): 
    class Meta(LogEntry.Meta): 
     db_table_name = 'my_log_table' #use another name here 

def log_addition(request, object): 
    LogEntry.objects.log_action(
     user_id   = request.user.pk, 
     content_type_id = ContentType.objects.get_for_model(object).pk, 
     object_id  = object.pk, 
     object_repr  = force_unicode(object), 
     action_flag  = ADDITION 
    ) 

Vous pouvez Maintenant, connectez-vous toutes vos notifications, etc., où ils se produisent avec log_addition(request, object) et filtrer la table de journal que pour vos besoins! Si vous voulez aussi enregistrer des changements/suppressions etc., vous pouvez vous rendre quelques fonctions d'aide pour cela!

+0

bien, c'est intéressant! Je vais essayer de cette façon! Merci! :) – dana

9

Il semble que vous avez besoin d'objets différents pour avoir des opérations communes ...

1) Dans ce cas, il pourrait être préférable de faire abstraction de ces propriétés dans une super classe ... Je veux dire que vous pourriez avoir un Event classe qui définit un champ user, et toutes vos autres classes d'événements la sous-classeraient.

class Event(model.Model): 
    user = models.ForeignKey(User) 
    date = ... 

class Reply(Event): 
    #additional fields 

class Vote(Event): 
    #additional fields 

Ensuite, vous pourrez effectuer les opérations suivantes

Event.objects.order_by("date") #returns both Reply, Vote and Event 

Départ http://docs.djangoproject.com/en/1.2/topics/db/models/#id5 pour plus d'informations sur l'héritage du modèle.

2) Vous pouvez également avoir un modèle Event avec une relation générique avec un autre objet. Cela me semble plus propre car Vote n'est conceptuellement pas un "événement". Départ: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1

Quoi qu'il en soit, je pense que votre problème est une question de conception

+0

oui, il semble être la seule solution. Merci! – dana

+1

+1 pour les relations génériques. –

+0

de toute façon, si j'utilise la méthode 'subclass', comment devrais-je changer mes (ci-dessus) requêtes pour remplir les nouveaux modèles créés, et obtenir des variables pour manipuler mon modèle? Je ne vois pas d'exemple dans la référence djangoproject. Merci! – dana

Questions connexes