【问题标题】:Django admin queryset foreign key to user django-allauthDjango admin queryset 用户 django-allauth 的外键
【发布时间】:2021-06-13 22:42:45
【问题描述】:

我有一个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)

【问题讨论】:

  • 您是否尝试从管理员中的已登录用户获取用户?如果是这种情况,您可以使用 request.user.email 代替 self.user.email
  • 不,我正在尝试从客户那里获取电子邮件,这是下订单的那一封

标签: python django django-admin django-queryset django-allauth


【解决方案1】:

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

试试下面的代码。

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)

希望这段代码对你有帮助

【讨论】:

    【解决方案2】:

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

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

    myordenobj.cliente.email
    

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

    myordenobj.cliente.username
    

    【讨论】:

    • 嗨,我使用的是 Django-allauth,它有一个电子邮件字段,忘记指出了
    • 我尝试了以下方法:a = queryset.cliente.email,我收到一条错误消息:'QuerySet' object has no attribute 'cliente'
    • 哦,我错过了...这是一个查询集。你必须遍历它。
    猜你喜欢
    • 2015-11-11
    • 2018-01-05
    • 2019-07-02
    • 2021-07-16
    • 2013-05-05
    • 1970-01-01
    • 2013-11-04
    • 2012-09-16
    • 2015-10-29
    相关资源
    最近更新 更多