Как выполнить левое объединение в django?

я хочу объединить две таблицы с помощью операции left join.

вот что мне нравится делать:

SELECT * FROM orders LEFT JOIN products ON (orders.product_id = products.id);

мои модельные классы:

class Orders(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False)
    qty = models.IntegerField(null=False, blank=False)
    product = models.ForeignKey(Products, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customers, on_delete=models.CASCADE)

    class Meta:
        db_table = 'orders'

class Products(models.Model):
    name = models.CharField(max_length=100, null=False)
    qty = models.IntegerField(default=0, null=True)
    price = models.FloatField(null=True, default=0)
    description = models.CharField(max_length=500, null=True, default=None)

    class Meta:
        db_table = "products"

Я не вижу никакого смысла в JOINах в Django. Если вам действительно нужны данные модели, эквивалентные Left JOIN, вы можете использовать для этого список.

def leftJoin():
    lst = []
    lst += Orders.objects.all()
    for order in Order.objects.all():
        for product in Products.objects.all():
            if order.product_id == product.id:
                lst += product
    return lst

Прелесть ORM в том, что вы больше не думаете в "строках и столбцах", а думаете в "объектах и свойствах"

Django сделает джойны за вас, если вы правильно структурируете свой запрос.

e.g.

Если вы хотите получить строки для связанной таблицы в одном запросе, вы можете сделать следующее:

orders = Orders.objects.all().select_related('product')

# This will do a join on the two tables and you can access the products from the orders without causing another DB request

for order in orders:
  print(order.id, order.product.id)

Если вы хотите отфильтровать заказы по определенному продукту, вы можете сделать следующее:

orders = Orders.objects.filter(product__name='Cool Product Name')

Вы также можете посмотреть этот ответ: https://stackoverflow.com/a/21272153/1184181

Вернуться на верх