我的模型名为" number"。它与ID不同,它在网站上显示的位置,用户可以对团队进行排序。
我需要一些默认属性的数字。我想我应该只计算数据库中的位置数量并添加一个,所以如果db中有15个位置,那么新的团队将在列表中排在最后并且有#34; number" 16。
但我不知道怎么做,在models.py文件中。
在views.py中我会使用
Iteam.objects.count()
但是我可以在模型声明中使用什么?模型如何检查自己?
修改
我试着按照Joey Wilhelm的建议去做:
from django.db import models
class ItemManager(models.Manager):
def next_number(self):
return self.count() + 1
class Iteam(models.Model):
name = models.CharField()
objects = ItemManager()
number = models.IntegerField(default=objects.next_number())
不幸的是我得到错误:
AttributeError: 'NoneType' object has no attribute '_meta'
答案 0 :(得分:1)
这实际上是你想要在经理身上做的事情,而不是模特本身。模型应表示单个实例并执行操作。而经理代表并执行一组实例的操作。所以在这种情况下你可能会想要这样的东西:
from django.db import models
class ItemManager(models.Manager):
def next_number(self):
return self.count() + 1
class Item(models.Model):
number = models.IntegerField()
objects = ItemManager()
话虽如此,我可以看到这会导致很多数据完整性问题。想象一下这个场景:
修改强>
上述方法仅适用于预生成'数字',例如:
Iteam.objects.create(number=Iteam.objects.get_number(), name='foo')
为了让它作为字段的实际默认值,您需要使用不那么美味的方法,例如:
from django.db import models
class Iteam(models.Model):
name = models.CharField()
number = models.IntegerField(default=lambda: Iteam.get_next_number())
@classmethod
def get_next_number(cls):
return cls.objects.count() + 1
但是,我仍然会警告这种方法,因为它仍然可能导致上述数据完整性问题。