Django 中抽象基 Class 中的自动递增非主键字段
Auto Increment Non-primary Key Field in Abstract Base Class in Django
我有一个抽象基础 class,许多模型都从中继承。它定义了一个名为 order
的字段。我将它内置到系统中,因为我经常需要以任意方式对我的对象进行排序(例如,为了在模板中列出)。但是,我经常发现订单字段离我远了,我迷失了方向(我允许 null=True
和 blank=True
)。我想有一种方法来确保无论何时创建具有顺序的模型类型的对象,Django 都会查找相同类型的其他对象并检查最高顺序号并相应地递增。
这可能吗?我试过使字段 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
中使用了这个方法,使用了 this question and answer:
中的信息
@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.
我有一个抽象基础 class,许多模型都从中继承。它定义了一个名为 order
的字段。我将它内置到系统中,因为我经常需要以任意方式对我的对象进行排序(例如,为了在模板中列出)。但是,我经常发现订单字段离我远了,我迷失了方向(我允许 null=True
和 blank=True
)。我想有一种方法来确保无论何时创建具有顺序的模型类型的对象,Django 都会查找相同类型的其他对象并检查最高顺序号并相应地递增。
这可能吗?我试过使字段 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
中使用了这个方法,使用了 this question and answer:
@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.