2011-10-25 10 views
6

He encontrado dos formas de implementar una simétrica sistema amistad (usted es mi amigo, por lo que también soy tu amigo) en Django:Amigos de Django como campo de muchos a muchos: mejor almacenamiento del perfil de usuario o de usuario (propio) en el campo?

como se sugiere en el interior de la documentación:

class UserProfile(models.Model): 
    friends = models.ManyToManyField(User, related_name='friends') 

Ahora, 'd como para obtener todos los modelos 'amigos' de usuario y userprofile con una sola consulta select_related como tal (que debería ser una marcha atrás se unió a las operaciones de búsqueda):

profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related() 

me consultar la userprofile, porque XX de manera, puedo usar select_related() y todos los objetos relacionados están en caché.

Por otro lado, puedo definir mi modelo de referencia al campo de los amigos a la "libre", así:

class UserProfile(models.Model): 
    friends = models.ManyToManyField('self') 

Ahora, mi amigo de búsqueda select_related parece que:

profiles = this_user.get_profile().friends.all().select_related() 

Siempre necesito ambos, el objeto del usuario y su perfil relacionado: el segundo enfoque es mucho más simple con respecto a la búsqueda revertida a través de select_related(), pero hace prácticamente lo mismo. Sin embargo, al usar "yo" como referencia de campo, Django maneja para mí la amistad simétrica. Por lo tanto, no tengo que crear dos entradas por amistad en la base de datos manualmente. Django hace eso por mí. La opción simétrica, sin embargo, solo funciona en campos de referencia "propios".

¿Cuál es la mejor solución? No puedo encontrar nada al respecto Cualquier idea apreciada, ¡gracias!

Respuesta

3

Simon,

A veces es mejor usar un plugin existente, en lugar de tratar de reinventar la rueda.

¿Has echado un vistazo a django-friends?

+2

Hmm, yepp, lo sé, gracias; también django-simple-friends ([link] (https://github.com/muhuk/django-simple-friends)), sin embargo, no es mucho trabajo implementar esta característica y sé exactamente lo que está pasando. Ambos paquetes son bastante extensos en características y la documentación sobre cómo usarlos es muy delgada. Además, ambas aplicaciones crean modelos adicionales; a favor de la simplicidad, prefiero usar ** un ** campo de muchos a muchos y dejar que Django maneje el resto. –

+0

+1 para django-simples-amigos –

Cuestiones relacionadas