0

私は次のような2つのモデルを持っています:

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モデルにカスタム作成メソッドを2つ書いてほしいので、これを書くとき:

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もう 1 つは、モデルにカスタムの 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 

これを達成する方法を教えてください。このコードはモデルまたはマネージャーに配置する必要がありますか?

みんな、ありがとう。

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 に答える