0

我有两个这样的模型:

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)

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

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 

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

谢谢大家。

4

2 回答 2

2

这将在会话管理器中。它看起来像(未经测试):

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 不应该需要任何自定义代码。

于 2011-06-30T20:27:24.607 回答
1

它必须进入经理,因为那是所在的get地方create。这些不是模型的方法。

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()
于 2011-06-30T20:23:50.377 回答