[更新:更改问题标题更具体]
很抱歉,如果我没有很好地提出这个问题,我无法知道如何做到这一点:
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>
你会做什么?
答案 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
函数不接受任何参数(甚至不是自我)此功能会自动使用下一个数字填充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关于自动递增是正确的:您甚至不需要声明这样的字段。只需使用pk
或id
,除非模型中有复合pk,否则它们的含义相同:
> w = Whatever(number=10)
> w
<Whatever object>
> w.id
None
> w.save()
> w.id
1
[update]好吧,我没有尝试过callable作为默认值。我想如果你修复这些错误,它必须有效。