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