2012-11-12 131 views
12

我在模型中有一个名为“admins”的m2m字段,我需要从视图中获取该字段中所有选定的条目,这些条目是用户标识。然后用用户ID获取每个用户的电子邮件。可能吗?Django - 从多个领域获取对象

我想要做的确切的事情是向这个平台内的空间的所有管理员发送大众信息。

空间模型:

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) 

查看发送同一电子邮件:

@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)) 
+0

请发表相关模型的代码。 – danihp

+0

@danihp对不起,你是对的。我添加了数据模型和当前视图 –

回答

21

,您可以:

space.related.all()返回用户

+1

它返回一个AttributeError空间对象没有“related_admins”http://imgur.com/nEMQi –

+10

您不需要在那里使用相关名称。只需'space.admins.all()'就可以了。 –

+0

当你想'space.admins.all()'返回'RecursionError'时会发生什么? – alvas

7

的查询集Django的1.9

​​

*正如Salvatore Iovene所述