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
)