繁体   English   中英

基于自定义权限为send_mail()构建收件人列表时,Django SubQuery错误

[英]Django SubQuery Error when Building a Recipient List for send_mail() based on Custom Permission

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

这是我的models.py和views.py。 如果格式已关闭,我深表歉意,我不想用不必要的信息弄乱问题。 models.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):
    ...

views.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)

谢谢你的时间。

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

我决定回答更广泛的问题。 为此,我略微更改了方法。 通过这种方法,最终用户管理员将只将用户移到专门为接收电子邮件而设计的组中。 现在,我可以根据身份验证用户搜索该组,将该组中的电子邮件放入列表中,然后将其添加到send_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,
        )

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM