2016-02-27 1 views
3

J'ai les tables membres, couleurs, groupes, members_colors, members_groups et colors_groups. Les tables members, colors, groups et colors_groups ont déjà les registres nécessaires mais j'en ai besoin quand un registre est ajouté à la table members_groups, vérifie automatiquement les couleurs assignées à ce groupe puis ajoute des registres à la table members_colors avec le membre spécifié dans la table members_groups et les couleurs assignées au groupe auquel le membre appartient.Utiliser un signal pour mettre à jour différentes tables

Je pense faire cela avec un signal post_save en utilisant members_groups comme expéditeur mais je n'arrive pas à comprendre comment.

EDIT: J'utilise la valeur par défaut User modèle de django et voici mon fichier models.py:

class Colors(models.Model): 
    name = models.CharField(max_length=50) 

class Groups(models.Model): 
    name = models.CharField(max_length=100) 

class Groups_Colors(models.Model): 
    group = models.ForeignKey(Groups, related_name='gc_group', null=True, blank=True) 
    color = models.ForeignKey(Colors, related_name='gc_color', null=True, blank=True) 

class Users_Colors(models.Model): 
    user = models.ForeignKey(User, related_name='uc_user', null=True, blank=True) 
    color = models.ForeignKey(Colors, related_name='uc_color', null=True, blank=True) 

class Groups_Users(models.Model): 
    group = models.ForeignKey(Groups, related_name='gu_group', null=True, blank=True) 
    user = models.ForeignKey(User, related_name='gu_user', null=True, blank=True) 

Ce que je veux quand un registre Groups_Users est ajouté, mettre à jour automatiquement la table Users_Colors en utilisant comme référence les données dans Groups_Users pour prendre les valeurs de Groups_Colors et User.

EDIT 2 Grâce à @ ilse2005, je peux faire fonctionner le signal comme je le souhaite. Voici le signal si quelqu'un besoin de quelque chose aussi bien:

@receiver(post_save, sender=Groups_Users, dispatch_uid='signal_receiver') 
def signal_receiver(sender, instance, **kwargs): 
    group = instance.group 
    user = instance.user 
    colors = Groups_Colors.objects.filter(group_id=group).values_list('color_id',flat=True) 
    for color in colors: 
     Users_Colors.objects.create(user_id=user, color_id = color) 

Répondre

2

Vous pouvez utiliser le post_save signal. Ajoutez ceci à votre models.py:

from django.db.models.signals import post_save 
from django.dispatch import receiver 

#sender is the Model after which save method the signal is called 
@receiver(post_save, sender=Groups_Users) 
def signal_receiver(sender, instance, created, **kwargs): 
    # instance is the new GroupUsers 
    group = instance.group 
    user = instance.user 
    # loop over Group_colors and create User_Colors 
    for color in group.gc_color.all(): 
     Users_Colors.objects.create(user=user, color.color) 
+0

que je reçois, mais la partie que je ne peux pas comprendre la logique est la '#Ne les trucs que vous want' partie. –

+0

Hm. Ne comprends pas vraiment ce que tu veux. Pourriez-vous poster vos modèles? – ilse2005

+0

Ok, j'ai posté les modèles. –