2009-07-03 7 views
1

j'ai une question sur django content_typesrequêtes Django, content_types génériques

Dans l'exemple de filtrer un QuerySet pour un type de contenu générique sur http://www.djangoproject.com/documentation/models/generic_relations/ il y a les lignes suivantes.

ctype = ContentType.objects.get_for_model(quartz) 
TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id) 

Quelqu'un peut-il expliquer ce que signifie content_type__pk?

Est-ce que __ signifie qu'il y a une indirection? Qu'est-ce que cela signifie dans le contexte de la partie gauche d'un match dans le filtre?

Je vois que dans la définition du modèle

content_type = models.ForeignKey(ContentType) 

mais lorsqu'ils sont traduits dans la base de données, il n'y a aucun champ appelé content_type, mais il y a une content_type_id ... alors est-ce que content_type__pk se traduit en fait content_type_id? Et si oui, pourquoi n'ont-ils pas utilisé cela dans l'exemple de filtre?

Répondre

2

Non, ce modèle est le TaggedItem qui a un champ de type ContentType, qui est appelé content_type.

Chaque modèle a un primary key auquel vous faites référence par "pk". La plupart du temps c'est le champ "id". Mais sometimes it is not. Afin d'être cohérent à ce sujet, vous pouvez vous référer au champ id en tant que pk. Alors, quand vous dites filtre (content_type__pk = ... il est similaire à filtre (content_type__id ...

Le double trait de soulignement (__) signifie une référence au champ de ce modèle. Vous pouvez garder l'empilement ceux-ci.

Car.objects.filter(category__supercategory__name = "Nice Cars") 

si vous aviez un modèle de voiture avec une clé étrangère à la catégorie, qui à son tour avait clé étrangère SUPERCATÉGORIES qui avait un champ nommé nom

Quelqu'un me corrige si j'ai tort.

+0

oui, bien sûr. D'une certaine manière parce que c'était content_type j'ai commencé à imaginer que c'était plus compliqué que d'habitude. Merci. – interstar

0

Si vous ne comprenez pas la notation de recherche à double trait de soulignement de Django, vous devez généralement lire les requêtes avant d'entrer dans les relations génériques. Ceci est basique et fondamental pour toutes les requêtes Django. N'essayez pas de courir avant de pouvoir marcher.

Commencez par le documentation pour les recherches sur les relations.

+1

Je suis d'accord avec cette réponse seulement parce que vous devriez considérer les génériques comme le dernier recours. Habituellement, vous n'en avez pas besoin, et vous saurez quand vous le faites. Certaines choses que j'ai faites avec des génériques pourraient encore être mises en œuvre en utilisant des modèles réguliers, et rétrospectivement, cela aurait peut-être été une meilleure solution. – drozzy

+0

En fait, je sais très bien que j'en ai besoin. Je suis un django noob, pas un développement un ;-) – interstar

+0

Eh bien, d'accord alors. Que la force soit avec toi! – drozzy

Questions connexes