【问题标题】:Custom order autofield in djangoDjango中的自定义订单自动字段
【发布时间】:2015-11-27 14:30:34
【问题描述】:

我有两个 django 模型:

class Question(models.Model):
    question = models.CharField(max_length=100)
    # some other not important to my question fields

class Field(models.Model):
    question = models.ForeignKey(Question)
    order = models.PositiveSmallIntegerField(default=1)

Field 类上的order 字段应该告诉我Question 字段将出现的顺序。我怎样才能让它自动增加问题?例如,我打开 django admin,添加一个问题,为一个问题添加一个字段,当我想为同一个问题添加另一个字段时,我希望看到 order 字段加一,因为我已经有了订单号为 1 的字段。有什么方法可以实现(自动递增)?我确实意识到,如果我想稍后更改订单,这可能是一项非常乏味的任务。也许我有更好的解决方案来解决这个问题(使用整数字段手动指定 DB 中条目的顺序)而不是在 DB 中有列?

【问题讨论】:

标签: python django django-models django-admin


【解决方案1】:

您可以使用AutoField自动增加字段,与id字段相同。

class Field(models.Model):
    question = models.ForeignKey(Question)
    order = models.AutoField(primary_key=False)

或者您可以通过覆盖保存方法自行完成:

from django.db.models import F


class Field(models.Model):
    ...
    def save(self, *args, **kwargs):
        if not self.order:
            # Using F object is important
            self.order = F('order') + 1
        return super(Field, self).save(*args, **kwargs)

【讨论】:

  • save 方法不是一个选项,因为它仅在事后更新字段,而 AutoField 如果考虑到问题则适合。我的意思是,对于不同的问题计数器应该再次从 1 开始。
  • AutoFields 必须设置 primary_key=True。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2014-01-12
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多