#python #django
Вопрос:
Я новичок в python и django и получаю следующую ошибку атрибута:
AttributeError at /account/1/
'Account' object has no attribute 'subscribers_set'
Я не знаю, почему это происходит, потому что у одной учетной записи может быть много подписчиков. В оболочке я могу запустить запрос для учетной записи, который вернет все объекты подписчика, например account.subscriber_set.all()
, возвращает <QuerySet [<Subscriber: bob@bob.com>, <Subscriber: sally@salhurst.com>, <Subscriber: jessy123@something.com>]>
, но по какой — то причине я не могу установить набор запросов в переменную: попытка установить переменную с subscribers = account.subscribers_set.all()
атрибутом ошибки возврата error: 'Account' object has no attribute 'subscribers_set'
В моем views.py У меня есть эта функция учетной записи:
def account(request, id):
account = Account.objects.get(id=id)
subscribers = account.subscribers_set.all() # error here?
context = {'account': account, 'subscribers': subscribers}
return render(request, 'accounts/account.html', context)
И мой взгляд:
{% extends 'accounts/main.html' %}
{% block content %}
<h1>Account Page for {{account}}</h1>
<p>Email Address: {{account.email}}</p>
{% for sub in subscribers %}
<p>{{subscriber}}</p>
{% endfor %}
{% endblock %}
И url.py:
urlpatterns = [
path('account/<str:id>/', views.account, name="account"),
]
Модель класса-это в основном просто модель пользователя:
class Account(AbstractUser):
pass
И между учетными записями и Подписчиками существует взаимосвязь «один:много».:
class Subscriber(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100, null=True, blank=True)
email = models.CharField(max_length=100, null=True)
date_joined = models.DateTimeField(auto_now_add=True, null=True)
verified = models.BooleanField(default=False)
account = models.ForeignKey(
Account, on_delete=models.CASCADE)
def __str__(self):
return self.email
Почему возникает эта ошибка и как ее можно исправить? Можете ли вы не хранить наборы запросов в переменных в python? Я новичок, поэтому я предполагаю, что это что-то совершенно очевидное, но я не могу найти решение.
Ответ №1:
Две вещи, которые я сразу замечаю, заключаются в том, что в вашей account()
функции вы переназначаете имя функции в качестве переменной и затеняете встроенную id
. Вам определенно не следует этого делать:
def get_account(request, ident):
account = Account.objects.get(id=ident)
subscribers = account.subscribers_set.all() # error here?
context = {'account': account, 'subscribers': subscribers}
return render(request, 'accounts/account.html', context)
Однако ни то, ни другое не является причиной проблемы. И ты будешь зол на себя, но, похоже, там орфографическая ошибка.
- В скорлупе:
account.subscriber_set.all()
- В кодексе:
account.subscribers_set.all()
У одного есть лишний s
…
Комментарии:
1. ах, не могу поверить в орфографическую ошибку! Спасибо
Ответ №2:
здесь обе эти функции дадут один и тот же результат
def account(request, id):
account = Account.objects.get(id=id)
subscribers = Subscriber.objects.filter(account=account)
context = {'account': account, 'subscribers': subscribers,}
return render(request, 'accounts/account.html', context)
def account(request, id):
account = Account.objects.get(id=id)
subscribers = account.subscriber_set.all()
context = {'account': account, 'subscribers': subscribers,}
return render(request, 'accounts/account.html', context)
вы все сделали правильно, вы просто написали «набор подписчиков» вместо «набор подписчиков».