【问题标题】:Auto Increment Non-primary Key Field in Abstract Base Class in DjangoDjango抽象基类中的自动增量非主键字段
【发布时间】:2021-05-29 08:30:36
【问题描述】:

我有一个抽象基类,许多模型都从该基类继承。它定义了一个名为order 的字段。我已将其内置到系统中,因为我经常需要以任意方式对我的对象进行排序(例如,用于在模板中列出)。但是,我经常发现订单字段离我而去,我迷失了方向(我允许null=Trueblank=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

【问题讨论】:

    标签: django django-models abstract-class


    【解决方案1】:

    您可以使用 defaultorder 字段中的函数来完成此操作

    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)
    

    【讨论】:

    • 感谢您的回答。我知道这是如何工作的,但由于它是一个抽象类,因此没有直接为它制作数据库表。只有子类获得数据库表,所以我认为您的解决方案必须应用于从抽象基类继承的所有模型。我尝试了几种方法,但没有成功。
    【解决方案2】:

    由于我主要对 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

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 2011-02-10
      • 2022-11-01
      • 2011-10-22
      • 2016-06-04
      • 1970-01-01
      • 2011-08-05
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多