где поставить метод, который работает на модели - PullRequest
1 голос
/ 10 мая 2009

Я работаю с Джанго.

У меня есть модель под названием Agrument. Аргументы есть у сторон и владельцев. У меня есть функция, которая возвращает сторону самого последнего аргумента определенного пользователя.

как obj.get_current_side (имя пользователя)

Я добавил это к фактической модели аргумента, как это

 def get_current_side(self, user):
        return self.argument_set.latest('pub_date').side

Я начинаю думать, что это не имеет смысла, потому что может не быть аргумента Аргумента Это место, где я бы использовал метод класса? Я думал о создании класса util, но думаю, что имеет смысл быть связанным с классом Argument.

Ответы [ 3 ]

2 голосов
/ 10 мая 2009

Было бы более разумно иметь методы экземпляра в модели User:

def get_current_side(self):
    try:
        return self.arguments.latest('pub_date').side
    except User.DoesNotExist, e:
        return None

Вы можете сделать это, расширив модель User, как описано здесь:

Редактировать: Я не совсем уверен, какое исключение выдается.

1 голос
/ 10 мая 2009

Это должен быть метод в менеджере пользовательских моделей:

# in models.py
class ArgumentManager(models.manager.Manager):
    def get_current_side(self, user):
        try:
            return self.filter(user=user).latest('pub_date').side
        except Argument.DoesNotExist:
            return None

class Argument(models.Model):
    # fields etc...

    objects = ArgumentManager()


# Calling:

side = Argument.objects.get_current_side(user)

Альтернативно вы можете расширить contrib.auth.user и добавить get_current_size() к нему. Но я не стал бы связываться с этим, пока не почувствую себя уверенно с Джанго.

Кстати: большая часть кода на этой странице неверна; например, переменная user вообще не используется в фрагменте OP.

0 голосов
/ 10 мая 2009

Я думаю, вы ищете модельных менеджеров.

Django документы для менеджеров с менеджерами вы можете добавить функцию в класс модели вместо экземпляра модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...