J'ai joué avec la nouvelle fonctionnalité d'agrégation dans l'ORM de Django, et il y a une classe de problèmes que je pense pense que devrait être possible, mais je n'arrive pas à obtenir pour travailler. Le type de requête que j'essaie de générer est décrit here.Django - trouver le membre extrême de chaque groupe
Alors, disons que je les modèles suivants -
class ContactGroup(models.Model):
.... whatever ....
class Contact(models.Model):
group = models.ForeignKey(ContactGroup)
name = models.CharField(max_length=20)
email = models.EmailField()
...
class Record(models.Model):
contact = models.ForeignKey(Contact)
group = models.ForeignKey(ContactGroup)
record_date = models.DateTimeField(default=datetime.datetime.now)
... name, email, and other fields that are in Contact ...
Ainsi, chaque fois qu'un contact est créé ou modifié, un nouvel enregistrement est créé, qui enregistre les informations tel qu'il apparaît dans le contact à ce moment-là , avec un horodatage. Maintenant, je veux une requête qui, par exemple, renvoie l'instance d'enregistrement la plus récente pour chaque contact associé à un groupe de contact. En pseudo-code:
group = ContactGroup.objects.get(...)
records_i_want = group.record_set.most_recent_record_for_every_contact()
Une fois que je reçois ce compris, je veux juste être en mesure de jeter un filter(record_date__lt=some_date)
sur le queryset, et obtenir l'information telle qu'elle existait à some_date
.
Quelqu'un a des idées?
edit: Il semble que je ne suis pas vraiment clair. En utilisant des modèles comme ceux-ci, je veux un moyen de faire ce qui suit à ORM pur django (sans supplément()):
ContactGroup.record_set.extra(where=["history_date = (select max(history_date) from app_record r where r.id=app_record.id and r.history_date <= '2009-07-18')"])
Mettre la sous-requête dans la clause where est une seule stratégie pour résoudre ce problème, les autres sont assez bien couvert par le premier lien que j'ai donné ci-dessus. Je sais que les sous-sélections where-clause ne sont pas possibles sans l'utilisation de extra(), mais je pensais que l'une des autres méthodes était peut-être rendue possible par les nouvelles fonctionnalités d'agrégation.
Pourquoi avez-vous une clé étrangère à un groupe de contact à partir des modèles d'enregistrement et de contact? En outre, un nitpick mineur, mais en utilisant auto_now ou auto_now_add sur votre DateTimeField au lieu de spécifier explicitement la valeur par défaut est généralement plus pratique. – oggy
Il existe une clé étrangère provenant de Record car il s'agit d'une copie exacte de Contact, plus la clé étrangère à contacter et le record_date. C'est un aperçu d'un contact à un moment donné. En outre, auto \ _now et auto \ _now \ _add sont connus pour causer des bogues difficiles à diagnostiquer, sont détestés par les committers de base, et ne sont guère plus pratiques que datetime.datetime.now –