Django - 计算模型声明中数据库中的对象

时间:2015-05-04 18:31:02

标签: django

我的模型名为" 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'

1 个答案:

答案 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()

话虽如此,我可以看到这会导致很多数据完整性问题。想象一下这个场景:

  • 创建了4个项目,编号为1,2,3,4
  • 第2项被删除
  • 创建了1个新项目;这个项目现在有4个,给你一个重复的

修改

上述方法仅适用于预生成'数字',例如:

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

但是,我仍然会警告这种方法,因为它仍然可能导致上述数据完整性问题。