微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django中抽象基类中的自动递增非主键字段

如何解决Django中抽象基类中的自动递增非主键字段

我有一个抽象基类,许多模型都继承了它。它定义了一个名为 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

解决方法

您可以使用 default 字段的 order 中的函数来完成

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。