在Django抽象基类中自动增加非主键字段



我有一个抽象基类,许多模型都是从它继承的。它定义了一个名为order的字段。我在系统中内置了这个功能,因为我经常需要以任意方式对对象进行排序(例如,在模板中列出对象)。然而,我经常发现订单字段远离我,我失去了跟踪(我允许null=Trueblank=True)。我希望有一种方法来确保无论何时创建一个order类型的model对象,Django都会查找相同类型的其他对象,并相应地检查最高的order数和增量。

这可能吗?我已经尝试使字段order自动递增(与AutoField),但Django抱怨说,我已经有一个自动字段,主键。我将使用主键ID,但这是任意分配的,并且不维护我想要的顺序。

下面是存放模型的模型工厂:

def abstract_base_model_factory():
class AbstractBaseModel(models.Model):
order = models.IntegerField(null=True, blank=True)
class Meta:
abstract = True
return AbstractBaseModel

您可以在order字段的default中使用函数

class YourModel(models.Model):
def order_value():
number = YourModel.objects.order_by('-order').first()
return number + 1 if number else 0
#fields of your model
#...
order = models.IntegerField(default=order_value, blank=True, null=True)

因为我主要对Django Admin中的这个值感兴趣,所以我在ModelAdmin中使用了这个方法,使用了来自这个问题和答案的信息:

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def increment_order(self):
obj = MyModel.objects.order_by('-order').first()
number = obj.order
return number + 1 if number else 0
def get_changeform_initial_data(self, request):
return {'order': self.increment_order}

提供的答案是有帮助的,但有一些事情是不正确的,这就是为什么我不选择它作为接受。谢谢@weAreStarDust。

最新更新