2012-04-11 22 views
10

suponer los siguientes modelos simples:Django y revertir las relaciones de claves externas

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    author = models.ForeignKey(User, related_name='author_set') 

¿Cómo puedo obtener todos los autores que participaron en un blog en particular (es decir, pk = 1)? Intenté algo como esto, pero no funcionó.

User.objects.author_set.filter(blog=Blog.objects.get(pk=1)) 

¡Muchas gracias de antemano!

+1

¿Tiene también autor de la clase o no? –

+0

No, ¿por qué importa esto? El modelo de autor es el modelo de usuario predeterminado. – Clash

+0

También puede reconsiderar el nombre de su 'related_name'. El nombre relacionado es lo que estará en sus objetos de Usuario, mapeando al conjunto de entradas. Algo como 'related_name = 'entries'' tendría mucho más sentido. De esta forma, cada objeto de Usuario tendría un conjunto de consultas de entradas. – dgel

Respuesta

11
User.objects.filter(author_set__blog__pk=1) 

que no estaba prestando atención a su nombre relacionado, por lo que el código anterior (revisado) ahora usa el nombre relacionado adecuada. Sin embargo, este es un realmente nombre relacionado incorrecto. El nombre relacionado debe describir lo que está en el lado opuesto, es decir, Entry. Entonces realmente debería ser related_name='entry_set'. Sin embargo, ese es el valor predeterminado de todos modos, por lo que puede eliminar related_name si solo quiere eso. Normalmente usaría una versión plural simple de la clase relacionada, que sería en este caso related_name='entries'. O bien, es posible que desee utilizar algo como "blog_entries" para ser más específico.

+0

acabo de notar que User.objects.filter (author_set__pk = 1) está disponible. ¿Esto me dará el mismo resultado? ¡Gracias por adelantado! – Clash

+3

No. Eso devolverá 'User's que son autores de' Entry' con pk = 1. Sin embargo, me di cuenta por su comentario que mi código no es del todo correcto. Ver actualización –

+0

bien, muchas gracias de nuevo! He aceptado tu respuesta. :) – Clash

Cuestiones relacionadas