簡體   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