帮助创建自定义创建和自定义get方法

时间:2011-06-30 20:12:28

标签: python django django-models django-managers

我有两个这样的模型:

class Visit(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=65535, null=False)

class Session:
    id = models.AutoField(primary_key=True)
    visit = models.ForeignKey(Visit)
    sequence_no = models.IntegerField(null = False)

我想两个人在Session模型中编写自定义创建方法,所以当我写这个时:

visitor = Vistor.objects.get(id=1)
new_session = Session.objects.create_new_session(visit=visitor)

...我在Session表中获得了一条新记录,其中包含该访问者的下一个连续序列号,即3.这是一些示例数据

VISITOR SEQUENCE_NO
------- -----------
1         1
1         2
2         1
2         2
1         3 (This would be the row that would be created)

另一个是在Session模型中编写自定义get方法,以便我写:

visitor = Vistor.objects.get(id=1)
new_session = Session.objects.get_session(visit=visitor, sequence_no=3)

...我得到了序列号最高的访问者的上一条记录。这是一些示例数据

VISITOR SEQUENCE_NO
------- -----------
1         1
1         2 (This would be the row that would be fetched)
2         1
2         2
1         3 

你能告诉我怎么做到这一点吗?此代码应该在模型还是管理器中?

谢谢大家。

2 个答案:

答案 0 :(得分:2)

这将是Sessions的经理。它看起来像(未经测试):

class SessionManager(models.Manager):
    def new_session(self, visit, **kwargs):
        vs = self.model.objects.filter(visit=visit).order_by("-sequence_no")[:1]
        if len(vs):
            kwargs.update({"sequence_no": vs.sequence_no + 1})
        return Super(SessionManager, self).create(visit=visit, **kwargs)

至于访问时获取会话,以及sequence_no,不应该有任何自定义代码。

答案 1 :(得分:1)

它必须进入经理,因为那是getcreate所在的位置。这些不是模型的方法。

class SessionManager(models.Manager):
    def get(self, *args, **kwargs):
        # your stuff here
        return super(SessionManager, self).get(*args, **kwargs)

    def create(self, *args, **kwargs):
        # your stuff here
        return super(SessionManager, self).create(*args, **kwargs)

class Session(models.Model):
    ...
    objects = SessionManager()