Django plusieurs-à-plusieurs relations, et par le biais de
Je veux stocker de l'utilisateur qui a demandé à un utilisateur à un groupe... mais django est de me dire ce est ambiguë et contre les règles (ce qui est logique).
groupes.groupe: Intermédiaire modèle
Group_to_Member a plus d'un
clé étrangère à l'Utilisateur, qui est
ambigu et n'est pas autorisée.
Alors, comment dois-je faire cela correctement? Peut-être une relation générique? pourrait fonctionner, mais semble un peu compliqué... Voici comment je m'approchais de lui (sans rapport avec les bits supprimé)
from django.contrib.auth.models import User
class UserGroup(models.Model):
members = models.ManyToManyField(User, through='Group_to_Member')
class UserGroup_to_Member(models.Model):
group = models.ForeignKey(UserGroup)
member = models.ForeignKey(User)
invited_by = models.ForeignKey(User, related_name="group_invited_users")
Solution
Ok, donc j'ai fait une petite combinaison des réponses les gars, vous fourni (Merci!) et les choses que j'ai trouvé sur internet en plus de ma propre certes maigres python-fu:
from django.contrib.auth.models import User
class UserGroup(models.Model):
# notice there is no member object here
... other model data
def add_member(self, **kwargs):
g2m = UserGroup_to_Member(group = self, **kwargs)
g2m.save()
def remove_member(self, member):
g2m = UserGroup_to_Member.objects.get(group=self, member=member)
g2m.delete()
# This is not elegant at all, help please? I'm pretty sure it isn't
# as bad on the database as it looks though.
def get_members(self):
g2ms = UserGroup_to_Member.objects.filter(group=self)
member_ids = [g2m.member.id for g2m in g2ms]
members = User.objects.none()
for id in member_ids:
members = members | User.objects.get(id=id)
return members
class UserGroup_to_Member(models.Model):
group = models.ForeignKey(UserGroup)
member = models.ForeignKey(User)
invited_by = models.ForeignKey(User, related_name="group_invited_users")
il n'est pas question d'ajouter un related_name, le problème est qu'il y a 2 foreignkey relations à l'Utilisateur, il n'a pas d'importance ce que je les appelle, ou si j'ai mis un related_name
L'autre avait exactement le même problème que vous (c'est à dire 2 clés étrangères sur la même table) j'ai donc pensé qu'il serait utile. Mon django-fu est une sorte de brute mais peut-être que j'ai mal compris votre question. Avez-vous de la bd? Pourquoi ne pas simplement lancer inspectdb sur elle et de voir quels sont les modèles qu'il génère? docs.djangoproject.com/en/dev/ref/django-admin
À partir de la documentation (à partir de la dernière réponse à cette autre question), il semblerait que ce que vous voulez faire n'est pas possible de sortir de la boîte. docs.djangoproject.com/en/dev/topics/db/models/...
Merci pour votre aide, j'ai obtenu une solution reconstitué
OriginalL'auteur Jiaaro | 2009-08-20
Vous devez vous connecter pour publier un commentaire.
Vous devez gérer vous-même:
Alors au lieu de
group.members.all()
vous negroup.membership_set.all()
.Aussi, je ne voudrais pas utiliser "Groupe", comme le nom de votre modèle, que Django a déjà un objet de Groupe.
... groupe.les membres de l'.tous les() renvoie un queryset de l'Utilisateur des objets, alors que le groupe.membership_set.tous les() renvoie un queryset de l'Adhésion des objets
la seule façon d'obtenir une liste des membres d'un groupe à l'aide de cette méthode est member_list = [m.membre pour m dans l'Adhésion.objets.filtre(groupe=groupe)]
Vous avez du mal. Vous êtes à la recherche pour les Utilisateurs, de sorte que vous avez à passer par le modèle de l'Utilisateur (ou un custom manager). Par conséquent, vous devez utiliser `membres = Utilisateur.objets.filtre(
OriginalL'auteur Graham King
Il est possible si vous utilisez Django 1.7.
De la documentation: https://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to-many-relationships
OriginalL'auteur Mauricio Abreu