1

したがって、これを 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')

数千単位の Picture レコードのサブセットがある場合、それらを並べ替え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()

私が期待している数千のレコードの場合、これには時間がかかりすぎる可能性があります。このタスクを実行するためのより効率的な方法はありますか? 私は最近、データベースの一括操作に関して Django が必ずしも「まだそこにある」とは限らないことを学んだので、SQL に頼る必要があるかもしれないと仮定しています。

4

1 に答える 1

1

OK、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引き続き使用することを意味するため、おそらくより良いでしょう。statementrow

于 2013-06-12T03:44:09.823 に答える