Помогите с созданием пользовательского create и пользовательского метода get - PullRequest
0 голосов
/ 01 июля 2011

У меня есть две модели, например:

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 

Не могли бы вы сказать мне, как это сделать, пожалуйста?Этот код должен быть в модели или менеджере?

Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Это будет в диспетчере сессий. Это будет выглядеть примерно так (не проверено):

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 голос
/ 01 июля 2011

Это должно было бы пойти в менеджере, так как именно там находятся 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()
...