Django Как проверить, является ли булево значение из ModelField истинным

У меня есть такой код в файле views.py

@login_required(login_url='home:login')
def profile_view(request):
    packetfree = Account.objects.get(packet_free=request.user)
    packetpremium = Account.objects.get(packet_premium=request.user)
    packetbusiness = Account.objects.get(packet_business=request.user)
    if packetfree is True:
        abo = "Free"
    elif packetpremium is True:
        abo = "Premium"
    elif packetbusiness is True:
        abo = "Business"

    context= {
        'person': request.user,
        'abo': abo

    }
    return render(request, 'home/profile.html')

И я хочу проверить, истинно ли значение булевой функции из модели, чтобы я мог узнать, какая из 3 булевых функций истинна, и узнать, какую подписку имеет пользователь в качестве Char, чтобы использовать ее в моем html шаблоне.

Я бы настоятельно советовал перемоделировать это и использовать поле с choices, или ForeignKey к AccountType модели, если могут быть созданы новые типы счетов. Сейчас используется три ForeignKey, и все они должны работать с разными related_name, это делает код неэлегантным, а запросы более сложными, например, здесь вы делаете три запроса к базе данных

Мы можем переделать это для фиксированного количества типов счетов следующим образом:

from django.conf import settings

class Account(models.Model):
    ACCOUNT_TYPE = [
        (0, 'free')
      , (1, 'premium')
      , (2, 'business')
      ]
    account_type = models.IntegerField(choices=ACCOUNT_TYPE)
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )

В этом случае вы можете получить тип счета с помощью:

from django.shortcuts import get_object_or_404

@login_required(login_url='home:login')
def profile_view(request):
    packet = get_object_or_404(Account, user=request.user)
    abo = packet.get_account_type_display()
    
    context= {
        'person': request.user,
        'abo': abo
    }
    return render(request, 'home/profile.html', context)

Если вы хотите работать с произвольным количеством Account типов, вы можете смоделировать это как:

class AccountType(models.Model):
    name = models.CharField(max_length=128, unique=True)
    
    def __str__(self):
        return self.name


class Account(models.Model):
    account_type = models.ForeignKey(
        AccountType,
        on_delete=models.CASCADE
    )
Вернуться на верх