Esto es probablemente insultantemente simple y digno de una risa de Nelson Muntz, pero estoy teniendo un momento de muerte cerebral real tratando de hacer muchas conexiones a través de varias relaciones modelo.Muchas o muchas búsquedas en Django
He los siguientes modelos (simplificado para su disfrute!):
class Document(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(User, blank=True)
content = models.TextField(blank=True)
private = models.BooleanField(default=False)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
friends = models.ManyToManyField(User, symmetrical=False,
related_name='user_friends')
ignored = models.ManyToManyField(User, symmetrical=False,
related_name='user_ignored')
Imaginging los siguientes usuarios:
- Alice tiene 3 documentos, 1 de los cuales es privada (es decir, sólo amigos puede ver ). Ella es amiga de Bob, está haciendo caso omiso de Mallory y es apática hacia Eva (es decir, sin relación almacenada ).
- Mallory tiene 2 documentos, ambos públicos y es apático para todos.
- Bob tiene 1 documento que es público y también es apático hacia todos.
- Eva está ignorando Alice y es apáticos a Mallory y Bob
usuarios que buscan documentos debe producir lo siguiente:
- Bob búsqueda de documentos deben véase 6, como Alice lo ha hecho un amigo y él puede ver sus documentos privados .
- Alicia buscando documentos debe ver 4, Bobs 1 y su 3. Ella no ver los documentos públicos de Mallory como Alicia está ignorando a Mallory.
- Mallory búsqueda de documentos ve 5 - las públicas de Alice, su propia 2 y Bobs 1. Alice ignorando su no tiene ninguna relación con lo que Mallory se puede ver, apenas que Alice no ve documentos de Mallory.
- Eve buscando documentos ve 3 - documentos públicos de Mallory y Bob como ella ha ignorado a Alice.
Básicamente, tengo una lucha mental para descifrar los filtros para devolver los querysets que describí anteriormente. ¿Alguien tiene alguna idea?
EDITAR
Gracias a la respuesta Ferdinands continuación pude a la tuerca a través de lo que quería con el principio que él me dio. En primer lugar, queremos obtener una lista de personas que me han friended que es una búsqueda inversa a través de la relación muchos a muchos:
friendly_authors = self.user.user_friends.all()
consiguen a todas las personas que han ignorado:
my_ignored = UserProfile.objects.get(user=self.user).ignored.all()
obtener una lista de documentos que puedo ver - documentos que son visibles, la mía, o escritos por personas que me han friended pero a la que no han pasado por alto:
docs = Document.objects.filter(
(Q(viewable=True) | Q(author=self.user) | Q(author__in=friendly_authors))
& ~Q(author__in=my_ignored)
)
+1 para la descripción clara del problema :) –