在django ORM中,您可以直接按关系属性进行过滤。例如,给定表格
class Product(models.Model):
product_id = models.IntegerField(primary_key=True)
color = models.TextField()
class Sale(models.Model):
sale_id = models.IntegerField(primary_key=True)
timestamp = models.DateTimeField()
product = models.ForeignKey(Product, on_delete=models.CASCADE)
你可以
Sale.objects.filter(product__color__in=['red', 'blue'])
或者甚至相反
Product.objects.filter(sale__timestamp__gt=datetime.now())
在sqlalchemy中执行此操作的正确方法是什么,没有显式的JOIN s?
答案 0 :(得分:1)
您可以使用any()
and has()
根据非标量和标量关系进行过滤。它们产生EXISTS子查询表达式:
session.query(Product).filter(Product.sales.any(Sale.timestamp > datetime.now()))
和
session.query(Sale).filter(Sale.product.has(Product.color.in_(['red', 'blue'])))
不幸的是,与使用显式联接相比,在某些DBMS上,EXISTS子查询表达式的性能可能较差。