django метод модели для возврата набора запросов с аннотацией - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь определить поле, которое вычисляется на основе user_type, я выполнил следующий метод, но он не работает, если кто-нибудь может посоветовать мне правильный подход.

так что я пытаюсь здесь нужно создать такой метод, как <user>.book_limit, чтобы вернуть максимальное количество разрешенных книг на основе user_type

#models.py 

class UserProfile(models.Model):
    class UserType(models.TextChoices):
        FREE = 'FR', 'FREE'
        BASIC = 'BS', 'BASIC'
        PREMIUM = 'PR', 'PREMIUM'

    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    bio = models.CharField(max_length=255)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)
    user_type = models.CharField(max_length=2, choices=UserType.choices, default=UserType.FREE)

    def __str__(self):
        return self.user.username

    @property
    def borrow_limit(self):
        return UserProfile.objects.annotate(book_limit=Case(
            When(user_type=UserProfile.UserType.FREE, then=Value('1')),
            When(user_type=UserProfile.UserType.BASIC, then=Value('2')),
            When(user_type=UserProfile.UserType.PREMIUM, then=Value('5')),
            default=Value('1'), output_field=IntegerField))

Ответы [ 2 ]

1 голос
/ 19 июня 2020

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

from django.db.models import Case, IntegerField, Value, When

class <b>UserProfileManager</b>(models.Manager):

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).annotate(
            book_limit=Case(
                When(user_type=UserProfile.UserType.FREE, then=Value(1)),
                When(user_type=UserProfile.UserType.BASIC, then=Value(2)),
                When(user_type=UserProfile.UserType.PREMIUM, then=Value(5)),
                default=Value(1),
                output_field=IntegerField()
            )
        )

class UserProfile(models.Model):
    class UserType(models.TextChoices):
        FREE = 'FR', 'FREE'
        BASIC = 'BS', 'BASIC'
        PREMIUM = 'PR', 'PREMIUM'

    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    bio = models.CharField(max_length=255)
    created_on = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)
    user_type = models.CharField(max_length=2, choices=UserType.choices, default=UserType.FREE)
    objects = <b>UserProfileManager()</b>
1 голос
/ 19 июня 2020

Вы можете настроить исходный набор запросов, как описано здесь .

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