Объект '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.

Вернуться на верх