Django admin queryset外键到用户django-allauth

Django admin queryset foreign key to user django-allauth

我有一个 e-commerce 开发,我想从 admin 站点向客户发送一个 email,我不能 queryset 正确去做这个。我有以下型号:

models.py:

class Orden(models.Model):
    cliente = models.ForeignKey(
        User, on_delete=models.CASCADE, verbose_name='Usuario')
    productos = models.ManyToManyField(OrdenProducto)
    fecha_orden = models.DateTimeField(auto_now_add=True)
    completada = models.BooleanField(default=False, null=True, blank=True)
    id_transaccion = models.CharField(max_length=20, null=True)
    correo_enviado = models.BooleanField(default=False, null=True, blank=True)
    datos_pedido = models.ForeignKey(
        'DatosPedido', on_delete=models.SET_NULL, blank=True, null=True)
    pago = models.ForeignKey(
        'Pago', on_delete=models.SET_NULL, blank=True, null=True)
    cupon = models.ForeignKey(
        'Cupon', on_delete=models.SET_NULL, blank=True, null=True)

    class Meta:
        verbose_name_plural = "Orden"

    def __str__(self):
        return self.cliente.username

cliente 有一个指向 User 模型的外键,我想获取 email 地址,我已经尝试了很多方法,但就是无法获取。

admin.py:

class OrdenAdmin(admin.ModelAdmin):
    list_display = ('cliente', 'completada', 'correo_enviado')
    actions = ['enviar_correo']

    def enviar_correo(self, request, queryset):
        queryset.update(correo_enviado=True)
        a = queryset.get(cliente=self.user.email)

        send_mail('test', 'test', 'xxxxxx@mail.com',
                  ['a], fail_silently=True)

除非您扩展了默认用户模型或创建了您自己的用户模型,否则 django 默认用户模型没有电子邮件字段。

因此,如果您已经扩展或创建了自己的模型,您可以这样做

myordenobj.cliente.email

但是,如果您使用的是默认用户模型并且您的用户名是电子邮件,那么请这样做。

myordenobj.cliente.username

您可以尝试迭代查询集以访问行中的特定数据。

试试下面的代码。

class OrdenAdmin(admin.ModelAdmin):
    list_display = ('cliente', 'completada', 'correo_enviado')
    actions = ['enviar_correo']

    def enviar_correo(self, request, queryset):
        queryset.update(correo_enviado=True)
        for obj in queryset:
            email = obj.cliente.email

        send_mail('test', 'test', email,
                  ['a], fail_silently=True)

希望这段代码对您有所帮助