[英]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.