所以我不确定是否将此作为Django或SQL问题,但我有以下模型:
class Picture(models.Model):
weight = models.IntegerField(default=0)
taken_date = models.DateTimeField(blank=True, null=True)
album = models.ForeignKey(Album, db_column="album_id", related_name='pictures')
我可能有数千个图片记录的子集,我需要按taken_date
对其进行排序,并通过设置weight
值来保留订单。
例如在Django中:
pictures = Picture.objects.filter(album_id=5).order_by('taken_date')
for weight, picture in enumerate(list(pictures)):
picture.weight = weight
picture.save()
现在我想要拥有的1000条记录,这可能需要太长时间。有没有更有效的方法来执行此任务?我假设我可能需要求助于SQL,因为我最近来学习Django不一定"还有"就数据库批量操作而言。
答案 0 :(得分:1)
好的,我在MySQL中将以下内容放在一起工作正常,但是我猜想有没有办法用Django ORM模拟这个?
UPDATE picture p
JOIN (SELECT @inc := @inc + 1 AS new_weight, id
FROM (SELECT @inc := 0) temp, picture
WHERE album_id = 5
ORDER BY taken_date) pw
ON p.id = pw.id
SET p.weight = pw.new_weight;
我会暂时搁置这个问题,以防万一有一些很棒的解决方案或应用可以解决这个问题,但上述查询~6000条记录需要0.11秒。
注意如果在MySQL中有以下设置,上述查询将在MySQL中生成警告:
binlog_format=statement
要解决此问题,您必须将binlog_format
设置更改为mixed
或row
。 mixed
可能更好,因为这意味着除了需要statement
以避免上述警告的情况外,您仍会使用row
。