Как выполнить левое объединение в 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