2

私はこれを書きました:

class Department(models.Model):
    ...
    sort_order = models.IntegerField(help_text="Leave negative to place at end", default=-1)

    def save(self, *args, **kwargs):
        """ Set the sort order (if unset) to larger than the largest value"""
        if self.sort_order <= 0:
            largest = Department.objects.all().aggregate(x = models.Max('sort_order'))['x'] or 0
            self.sort_order = largest + 10
        super(Department, self).save(*args, **kwargs)

しかし、私はそれを誇りに思っていません。これを行うより良い方法はありますか?これをフィールドにロールインすることはできますが、コードをリファクタリングした場合にモデル テーブルに戻る方法がわかりません。自動インクリメント列は FK 値として変更できないため、使用できません。

4

2 に答える 2

1

Django Positionsの PositionFieldがこれを行っているようで、現在Django CrowdSourcingで使用されています。これはまさに私が求めていたものではありませんが、適切で使いやすいソリューションのようです。

于 2013-05-07T13:57:03.320 に答える
0

私が鈍感で申し訳ありませんが、django に組み込まれているAutoFieldはあなたが探していることをしません。

主キーをいじりたくないのはわかっていますが、別のAutoField.

sort_field = models.AutoField()

たぶん、AutoField をオーバーライドして、必要なことを行うことができます。

于 2013-03-06T18:38:54.333 に答える