как я могу исправить ManyToManyDescriptor из модели класса урока - просмотр? - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь создать платформу с одним курсом, где я буду хранить только материалы модулей уроков, и только люди с членством смогут их увидеть, однако, когда я пытаюсь получить Lesson.course_allowed_mem_types.all(), я получил следующую ошибку: 'ManyToManyDescriptor' object has no attribute 'all' , как исправить эту простую ошибку?

class Lesson(models.Model):
  content_title = models.CharField(max_length=120)
  content_text = models.CharField(max_length=200)
  thumbnail = models.ImageField(upload_to='static/xxx/xxx/xxx/xxx')
  link = models.CharField(max_length=200, null=True)
  allowed_memberships = models.ManyToManyField(Membership)
​
  def __str__(self):
    return self.content_title

просмотры

def get_context_data(self, **kwargs):
        context = super(bootCamp, self).get_context_data(**kwargs)
        context['lessons'] = Lesson.objects.all()
        user_membership = UserMembership.objects.filter(user=self.request.user).first()
        user_membership_type = user_membership.membership.membership_type
        course_allowed_mem_types = Lesson.allowed_memberships.all()
        context['course_allowed_mem_types'] = course_allowed_mem_types
        return context

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Вы можете запросить связанное поле типа «многие ко многим» только для экземпляра модели, но не для класса модели. Не совсем понятно, что именно «все конкретные разрешенные объекты членства для класса Урок» (Lesson.allowed_memberships.all()).

Это "все объекты членства, связанные с любым из существующих объекты урока " или это " все объекты членства, которые могут быть связаны с объектом урока "?

Это разные запросы, и Lesson.allowed_memberships.all() тоже не подразумевает, это неправильное использование.

Если вы хотите первое, что-то вроде этого может сработать

Membership.objects.filter(lesson__in=Lesson.objects.all())

(У вас уже есть это как context['lessons'], используйте его вместо этого, просто демонстрируя идею)

0 голосов
/ 06 мая 2020

Если вы хотите создать собственный список, например тип, всегда рекомендуется унаследовать от collections.abc.Iterable. Он предоставляет общие операции, необходимые для работы с такими типами контейнеров. Вы не можете просто вызвать .all() для любого объекта / типа, это определение типа действительно должно иметь all() метод, определенный в классе или родительском классе.

например,

class ListLike:
    def __init__(self):
        ...
    def all(self):
        return some_iterator
0 голосов
/ 06 мая 2020

Я думаю, на один урок может быть много абонементов. поэтому вы выбираете все уроки со всеми членствами Lesson.allowed_memberships.all().

Попробуйте выбрать один урок, а затем получите связанных членов

lesson = Lessons.objects.filter(pk=1) course_allowed_mem_types = lesson.allowed_memberships.all()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...