如何在django admin中创建一个自动填充和自动递增字段

时间:2010-06-26 12:04:05

标签: python django django-models django-admin default-value

[更新:更改问题标题更具体]

很抱歉,如果我没有很好地提出这个问题,我无法知道如何做到这一点:

class WhatEver():
    number = model.IntegerField('Just a Field', default=callablefunction)
...

callablefunction执行此查询的位置:

from myproject.app.models import WhatEver

def callablefunction():
    no = WhatEver.objects.count()
    return no + 1

我想自动写下一个号码,我不知道该怎么做。

我有来自callablefunction的错误,指出它无法导入模型,我认为必须有一种更简单的方法来执行此操作。甚至不需要使用它,但我无法用pk编号来确定如何使用它。

我已经搜索了这个,我发现的唯一一件事是使用save()方法自动递增数字...但是我想在保存之前在<textfield>中显示它...... / p>

你会做什么?

4 个答案:

答案 0 :(得分:22)

知道了!我希望这会帮助每个人在django中制作自动填充和自动递增字段时遇到任何问题。解决方案是:

class Cliente(models.Model):
    """This is the client data model, it holds all client information. This
       docstring has to be improved."""
    def number():
        no = Cliente.objects.count()
        if no == None:
            return 1
        else:
            return no + 1

    clientcode = models.IntegerField(_('Code'), max_length=6, unique=True, \
    default=number)

    [... here goes the rest of your model ...]

注意:

  • number函数不接受任何参数(甚至不是自我)
  • 在模型
  • 中编写之前所有内容
  • 这是在django 1.2.1
  • 上测试的

此功能会自动使用下一个数字填充clientcode字段(即如果您有132个客户端,当您添加下一个客户端时,该字段将填充clientcode数字133)

我知道这对于大多数实际情况来说都是荒谬的,因为PK号码也是自动递增的,但是在django admin中没有办法自动填充或实际使用它。

[更新:正如我在评论中所述,有一种方法可以使用主键,但它不会填充之前 保存]

答案 1 :(得分:7)

每个Django模型都有一个auto-generated primary key

id = models.AutoField(primary_key=True)

您似乎正在尝试复制已存在的行为,只需使用对象主键。

答案 2 :(得分:6)

我也遇到过这个问题,我的实例是customer.number,它与客户Store相关。我很想使用类似的东西:

# Don't do this:

class Customer(models.Model):
    # store = ...
    number = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        if self.number == 0:
            try:
                self.number = self.store.customer_set.count() + 1
            else:
                self.number = 1
        super(Customer, self).save(*args, **kwargs)

以上可能导致一些问题:假设有10个客户,我删除了客户编号6.下一个要添加的客户(看似)是第10个客户,然后成为第二个客户#10。 (这可能会导致get()查询集中的大错误)

我最终得到的是:

class Store(models.Model):
    customer_number = models.IntegerField(default=1)

class Customer(models.Model):
    store = models.ForeignKey(Store)
    number = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        if self.number == 0:
            self.number = self.store.customer_number
            self.store.number += 1
            self.store.save()
        super(Customer, self).save(*args, **kwargs)

PS:

你多次抛出你希望这个字段填入“之前”。我想你想在保存之前填写它以便你可以访问它。我要说的是:这种方法允许您访问store.customer_number以查看下一个号码。

答案 3 :(得分:0)

您的代码有错误,这就是您无法导入的原因:

from django.db import models
class WhatEver(models.Model):
    number = models.IntegerField('Just a Field', default=0)

和Yuval A关于自动递增是正确的:您甚至不需要声明这样的字段。只需使用pkid,除非模型中有复合pk,否则它们的含义相同:

> w = Whatever(number=10)
> w
<Whatever object>
> w.id
None
> w.save()
> w.id
1

[update]好吧,我没有尝试过callable作为默认值。我想如果你修复这些错误,它必须有效。