基于自定义权限为send_mail()生成收件人列表时出现Django子查询错误

2024-10-03 23:20:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为send_mail()编写一个收件人列表,该列表将查询具有自定义权限的用户并将他们放入列表中。其目的是使用Django admin使用户更容易将用户放入具有此权限的组中以接收电子邮件。我收到这个more than one row returned by a subquery。我正在使用modelBase,它有几个子模型,因此自定义权限会将其自身附加到多个模型上。如何调整代码以清除此错误并生成所需的收件人列表

这是我的models.py和views.py。我很抱歉,如果格式是关闭的,我不想混乱的问题与不必要的信息。 型号.py:

class StoreNightlyReportsBase(models.Model):
    store_nightly_report = models.ForeignKey(StoreNightlyReport)
    no_new_item = models.BooleanField(verbose_name="Check if No New Items", default=False)
    customer = models.CharField(verbose_name='Customer Name', max_length=20, null=True, blank=True)

    class Meta:
        abstract = True
        permissions = (('nightly_reports','Nightly Reports'),
                       )


class StoreNightlyReportsNewLoan(StoreNightlyReportsBase):
    ...


class StoreNightlyReportsRenewals(StoreNightlyReportsBase):
    ...

视图.py

class StoresNightlyReportsNewLoansCreate(CreateView):
    ...

    def get_form(self, form_class=None):
        ...

    def get_context_data(self, **kwargs):
        ...

    def form_valid(self, form):
        ...


        perm = Permission.objects.filter(codename='nightly_reports')
        users = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct()
        recipients = list(i for i in users.values_list('email', flat=True) if bool(i))
        html_email = render_to_string('reports/email.html', {
            'object': self.object,
            'user': self.request.user,
        })
        send_mail(
            'Nightly Numbers',
            'Here is the message.',
            'emailp@company.com',
            [recipients],
            html_message=html_email,
            fail_silently=False,
        )

    return super(StoresNightlyReportsNewLoansCreate, self).form_invalid(form)

谢谢你的时间


Tags: 用户pyselfformtrue权限permissions列表
1条回答
网友
1楼 · 发布于 2024-10-03 23:20:57

这里更广泛的问题是允许最终用户使用Django Admin将用户移动到具有特定权限的组中以接收电子邮件。直接的问题是使用权限来完成这个任务,但是抛出了一个错误

我决定回答更广泛的问题。在这样做时,我稍微改变了我的方法。在这种方法中,终端用户管理员只需将用户移动到专门为接收电子邮件而设计的组中。现在我可以根据authenticate user搜索组,将该组中的电子邮件拉入列表,然后将其添加到send\u mail()中的收件人

代码如下:

def form_valid(self, form):
        ...
        groups = self.request.user.groups.filter(name__startswith='Nightly Reports')
        recipients = list(User.objects.filter(
            email__contains='@',
            groups__in=groups).values_list('email', flat=True))

        html_email = render_to_string('reports/email.html', {
                'object': self.object,
                'user': self.request.user,
        })
        send_mail(
            'Nightly Numbers',
            'Here is the message.',
            'company@company.com',
            recipients,
            html_message=html_email,
            fail_silently=False,
        )

这可以回答更广泛的问题,并通过不使用权限查询来删除直接问题引发的错误

相关问题 更多 >