Consulta compleja con Django (publicaciones de todos los amigos)

Soy nuevo en Python y Django, así que ten paciencia conmigo.

Tengo los siguientes modelos:

class User(models.Model): name = models.CharField(max_length = 50) ... class Post(models.Model): userBy = models.ForeignKey(User, related_name='post_user') userWall = models.ForeignKey(User, related_name='receive_user') timestamp = models.DateTimeField() post = models.TextField() class Friend(models.Model): user1 = models.ForeignKey(User, related_name='request_user') user2 = models.ForeignKey(User, related_name='accept_user') isApproved = models.BooleanField() class Meta: unique_together = (('user1', 'user2'), ) 

Sé que esta puede no ser la mejor / la forma más fácil de manejarlo con Django, pero lo aprendí de esta manera y quiero mantenerlo así.

Ahora, todo lo que quiero hacer es obtener todos los mensajes de una persona y sus amigos . La pregunta ahora es ¿cómo hacerlo con los filtros Django?

Creo que en SQL se vería algo así:

 SELECT p.* FORM Post p, Friend f WHERE p.userBy=THEUSER OR ( (f.user1=THEUSER AND f.user2=p.userBy) OR (f.user2=THEUSER AND f.user1=p.userBy) ) 

Sin garantía de corrección, solo para dar una idea del resultado que estoy buscando.

 from django.db.models import Q Post.objects.filter( \ Q(userBy=some_user) | \ Q(userBy__accept_user__user1=some_user) | \ Q(userBy__request_user__user2=some_user)).distinct() 

ACTUALIZAR

Lo siento, fue mi culpa. No le related_name atención a los valores de related_name . Ver código actualizado arriba. El uso de userBy__accept_user o userBy__request_user solo no funcionará porque será una referencia a Friend que no se puede comparar con User . Lo que estamos haciendo aquí es seguir la relación inversa con un Friend y luego, una vez que estamos allí, ver si el otro usuario en la solicitud de amigo es el usuario en cuestión.

Esto también ilustra la importancia de describir adecuadamente las relaciones inversas. Muchas personas cometen el mismo error que usted ha cometido aquí y nombran el nombre related_name el modelo que están creando el FK para ( User ), cuando en realidad, cuando estamos hablando de revertir el FK, ahora estamos hablando de Friend . Simplemente, sus nombres relacionados tendrían más sentido como algo así como: friend_requests y friend_requests .

 (with User u) friends_u1 = Friend.objects.filter(user1 = u).getlist('user2_id', flat=True) friends_u2 = Friend.objects.filter(user2 = u).getlist('user1_id', flat=True) friends_and_user = friends_u1+friends_u2+u.id Post.objects.filter(userBy__id__in = friends_and_user)