MalikDeveloper2077
@MalikDeveloper2077

Куда в Django вставлять кастомные методы в моделях?

Я добавил логики в кастомные методы в моей модели.
Я сделал это для использования этих методов во views.py

Модель:

class Quiz(models.Model):
    # Some fields..

    # And some example methods that contain a logic
    def get_manage_questions_url(self):
        return reverse('manage-questions', kwargs={'slug': self.slug})

    def get_likes_count(self):
        return self.likes.count()

    def get_completed_count(self):
        return QuizManager.objects.filter(quiz=self, completed=True).count()

    def like_quiz(self, quiz, user):
        data = {}

        if user in quiz.likes.all():
            quiz.likes.remove(user)
            data['liked'] = False
        else:
            quiz.likes.add(user)
            data['liked'] = True

        data['likes'] = quiz.get_likes_count()

        return data

    def increase_views(self):
        self.views += 1
        self.save(update_fields=('views',))


У меня есть вопрос:
Нужно ли мне писать все кастомные методы в модели или мне нужно поместить такие методы в менеджер типа QuizManager(models.Manager) и определить атрибут "objects" в модели Quiz?
  • Вопрос задан
  • 329 просмотров
Решения вопроса 1
@Realmixer
Full stack Python (Django) web-developer
Правило простое: если метод производит действия над группой экземпляров, то помещаем его в менеджер, а если над одним экземпляром, то в модель.

И ещё на счёт increase_views — не советую так делать. Если в одно время случится два вызова, то значение увеличится не на два, а лишь на единицу. Значение нужно увеличивать на стороне БД — благодаря транзакционности будут учтены оба вызова. На Django ORM это выглядит так:
from django.db.models import F

class Quiz(models.Model):
    ...
    def increase_views(self):
        self.__class__.objects.filter(pk=self.pk).update(views=F('views') + 1)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы