Объект 'ManyRelatedManager' не имеет атрибута - Django
Очень новичок в Django - заранее прошу прощения за плохое описание!
У меня есть две модели django:
class Suite(models.Model):
slug = models.SlugField()
client_name = models.ForeignKey(Client, blank=True, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=120)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('courses:detail', kwargs={'slug': self.slug})
@property
def lessons(self):
return self.portfolioupdate_set.all().order_by('position')
class PortfolioUpdate(models.Model):
slug = models.SlugField()
title = models.CharField(max_length=120)
suite = models.ForeignKey(Suite, on_delete=models.SET_NULL, null=True)
# suite = models.ManyToManyField(Suite)
position = models.IntegerField()
video_url = models.CharField(max_length=200)
thumbnail = models.ImageField()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('courses:lesson-detail',
kwargs={
'course_slug': self.suite.slug,
'lesson_slug': self.slug
})
Я отображаю список обновлений портфеля следующим образом:
class PortfolioUpdateListView(LoginRequiredMixin, ListView):
def get(self, request, course_slug, *args, **kwargs):
user = self.request.user
suite = get_object_or_404(Suite, adviser__user=user, slug=course_slug)
context = {'object': suite}
return render(request, "courses/lesson_list.html", context)
Я хотел бы иметь поле 'suite' как ManyToManyField, а не ForeignKey, чтобы обновление портфолио могло относиться ко многим suite, а не обновление портфолио относилось к одному suite. Когда я изменяю это в моделях и пытаюсь отобразить страницу, я получаю сообщение 'ManyRelatedManager' object has no attribute 'slug'.
Возможно ли то, что я описал, и если да, то как мне это отобразить? Заранее большое спасибо.
Я хотел бы иметь поле 'suite' как ManyToManyField, а не ForeignKey, чтобы обновление портфолио могло относиться ко многим suite, а не обновление портфолио относилось к одному suite. Когда я изменяю это в модели и пытаюсь отобразить страницу, я получаю, что объект 'ManyRelatedManager' не имеет атрибута 'slug'.
Это связано с вашим методом get_absolute_url
:
def get_absolute_url(self):
return reverse(
'courses:lesson-detail',
kwargs={
# .slug for .suite? ↓
'course_slug': self.suite.slug,
'lesson_slug': self.slug
}
)
Действительно, если заменить suite
на ManyToManyField
, то это означает, что PortfolioUpdate
ссылается на ноль, один или несколько Suite
. Но вы не можете получить .slug
коллекции Suite
, так как может быть ноль Suite
или несколько, где Suite
будут иметь разные пули.
Пожалуй, лучший способ исправить это - удалить course_slug
из шаблона URL, а значит, и из вызова reverse
.