我有两个这样的模型:
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
你能告诉我怎么做到这一点吗?此代码应该在模型还是管理器中?
谢谢大家。
答案 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)
它必须进入经理,因为那是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()