假设我Product在店面中有一个带有产品的模型,以及一个ProductImages包含产品图像的表格,其中可以包含零个或多个图像.这是一个简化的例子:
class Product(models.Model):
product_name = models.CharField(max_length=255)
# ...
class ProductImage(models.Model):
product = models.ForeignKey(Product, related_name='images')
image_file = models.CharField(max_length=255)
# ...
Run Code Online (Sandbox Code Playgroud)
在显示产品的搜索结果时,我想优先考虑具有与之关联的图像的产品.我可以轻松获得图像数量:
from django.db.models import Count
Product.objects.annotate(image_count=Count('images'))
Run Code Online (Sandbox Code Playgroud)
但这实际上并不是我想要的.我想用布尔字段对它进行注释have_images,指示产品是否有一个或多个图像,以便我可以按以下方式排序:
Product.objects.annotate(have_images=(?????)).order_by('-have_images', 'product_name')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?谢谢!
首先,从一些细节来描述整体情况:
也就是说,这是非常高度使用的表(每秒大约500个INSERT,许多SELECT,使用行级锁定)我正在运行DELETE查询:
CREATE TABLE `sales` (
`sale_id` int(32) unsigned NOT NULL auto_increment,
`start_time` int(20) unsigned NOT NULL,
`end_time` int(20) unsigned default NULL,
`identifier` char(9) NOT NULL,
`zip_code` char(5) NOT NULL,
`income` mediumint(6) unsigned NOT NULL,
PRIMARY KEY USING BTREE (`sale_id`),
UNIQUE KEY `SALE_DATA` (`ssn`,`zip_code`,`income`),
KEY `SALE_START` USING BTREE (`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii ROW_FORMAT=FIXED
Run Code Online (Sandbox Code Playgroud)
该DELETE查询看起来是这样的,并且运行的cron每隔五分钟(我宁愿每分钟运行一次):
DELETE FROM `sales` WHERE
`start_time` < UNIX_TIMESTAMP(NOW() - …Run Code Online (Sandbox Code Playgroud)