Get objects from a many to many field

71,614

Solution 1

You can use:

space.related.all()

to return a QuerySet of User

Solution 2

For Django >= 1.9

space.admins.all()

As mentioned by Salvatore Iovene

Solution 3

To get all many_to_many objects (not for specific space), for me works

Space.admins.through.objects.all()

(Django 2.14)

Share:
71,614

Related videos on Youtube

CastleDweller
Author by

CastleDweller

Updated on July 09, 2022

Comments

  • CastleDweller
    CastleDweller almost 2 years

    I have an m2m field called "admins" inside a model and I need to obtain from a view all the selected entries in that field, which are user IDs. Then with the user IDs obtain the emails for every user. Is it possible?

    The exact thing I want to do is to send a mass email to all the admins of a space inside this platform.

    Spaces model:

    class Space(models.Model):
    
        """     
        Spaces model. This model stores a "space" or "place" also known as a
        participative process in reality. Every place has a minimum set of
        settings for customization.
    
        There are three main permission roles in every space: administrator
        (admins), moderators (mods) and regular users (users).
        """
        name = models.CharField(_('Name'), max_length=250, unique=True,
            help_text=_('Max: 250 characters'))
        url = models.CharField(_('URL'), max_length=100, unique=True,
            validators=[RegexValidator(regex='^[a-z0-9_]+$',
            message='Invalid characters in the space URL.')],
            help_text=_('Valid characters are lowercase, digits and \
        admins = models.ManyToManyField(User, related_name="space_admins", verbose_name=_('Administrators'), help_text=_('Please select the \
            users that will be administrators of this space'), blank=True,
            null=True)
        mods = models.ManyToManyField(User, related_name="space_mods",
            verbose_name=_('Moderators'), help_text=_('Please select the users \
            that will be moderators of this space.'), blank=True, null=True)
        users = models.ManyToManyField(User, related_name="space_users", verbose_name=_('Users'), help_text=_('Please select the users that \
            can participate on this space'), blank=True, null=True)
    

    View for sending just one email:

    @login_required
    def add_intent(request, space_url):
    
        """
        Returns a page where the logged in user can click on a "I want to
        participate" button, which after sends an email to the administrator of
        the space with a link to approve the user to use the space.
        
        :attributes:  space, intent, token
        :rtype: Multiple entity objects.
        :context: space_url, heading
        """
        space = get_object_or_404(Space, url=space_url)
        #admins = space.admins??
    
        try:
            intent = Intent.objects.get(user=request.user, space=space)
            heading = _("Access has been already authorized")
            
        except Intent.DoesNotExist:
            token = hashlib.md5("%s%s%s" % (request.user, space,
                                datetime.datetime.now())).hexdigest()
            intent = Intent(user=request.user, space=space, token=token)
            intent.save()
            subject = _("New participation request")
            body = _("User {0} wants to participate in space {1}.\n \
                     Please click on the link below to approve.\n {2}"\
                     .format(request.user.username, space.name,
                     intent.get_approve_url()))
            heading = _("Your request is being processed.")
            send_mail(subject=subject, message=body,
                      from_email="[email protected]",
                      recipient_list=[space.author.email])
    
            # Send a notification to all the admins in that space
            #send_mass_mail()
    
        return render_to_response('space_intent.html', \
                {'space_name': space.name, 'heading': heading}, \
                context_instance=RequestContext(request))
    
  • CastleDweller
    CastleDweller over 11 years
    It returns an AttributeError Space object doesn't have "related_admins" imgur.com/nEMQi
  • Salvatore Iovene
    Salvatore Iovene over 11 years
    You don't need to use the related name there. Simply space.admins.all() will do.
  • alvas
    alvas almost 8 years
    What happens when you want to space.admins.all() returns RecursionError?
  • Love Putin
    Love Putin almost 4 years
    Getting AttributeError: 'ManyToManyDescriptor' object has no attribute 'all'