Простой объект python не имеет атрибута и не может задать набор запросов в качестве переменной

#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)
 

вы все сделали правильно, вы просто написали «набор подписчиков» вместо «набор подписчиков».