繁体   English   中英

试图将 SQL 的左连接转换为 Django 查询集?

[英]Trying to convert Left Join of SQL into Django query-set?

这是我的models.py文件

class Customer(models.Model):
    """All Customers details goes here"""

    name = models.CharField(max_length=255, null=False)
    firm_name = models.CharField(max_length=255, null=False)
    email = models.EmailField(null=False)
    phone_number = models.CharField(max_length=255, null=False)
    location = models.CharField(max_length=255,null=True)
    date_created = models.DateTimeField(auto_now_add=True)

    class Meta:
        """Meta definition for Customer."""

        verbose_name = 'Customer'
        verbose_name_plural = 'Customers'

    def __str__(self):
        """Unicode representation of Customer."""
        return self.name


class Order(models.Model):
    """All order details goes here.It has OneToMany relationship with  Customer"""
    STATUS = (
        ('CR', 'CR'),
        ('DR', 'DR'),
    )

    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
    bill_name = models.CharField(max_length=255, null=False)
    payment_date=models.DateField(auto_now=False)
    status = models.CharField(max_length=255, choices=STATUS, null=False)
    amount = models.FloatField(max_length=255, null=False)
    date_created = models.DateTimeField(auto_now_add=True)
    description = models.TextField(null=True)

    class Meta:
        """Meta definition for Order."""

        verbose_name = 'Order'
        verbose_name_plural = 'Orders'

    def __str__(self):
        """Unicode representation of Order."""
        return self.bill_name

我只想访问客户的姓名和订单的所有字段,简而言之,我想在 Django 查询集中转换以下 SQL

select name,bill_name,status from accounts_customer left join accounts_order on accounts_customer.id = accounts_order.customer_id where accounts_order.status="DR";

您可以使用两种方式执行连接操作:第一种:通过使用 select_related 即 Order.objects.select_related('customer') 第二种:通过使用过滤器:即 Order.objects.filter(status__iexact="DR")

要在订单 object 上附加客户姓名,您可以使用带有F表达式的annotate https://docs.djangoproject.com/en/3.0/ref/models/expressions/#using-f-with-annotations

orders = Order.objects.annotate(
    customer_name=F('customer__name')
).filter(status='DR')

for order in orders:
    print(order.customer_name)

如果您怀疑要访问更多客户属性,则可能需要select_related (稍微多一点 memory,更大的查询)。 Django ORM中的select_related和prefetch_related有什么区别?

orders = Order.objects.select_related('customer').filter(status='DR')

for order in orders:
    print(order.customer.name)

暂无
暂无

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

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