如何从课程类模型视图修复ManyToManyDescriptor



我正试图建立一个单课程平台,在那里我只会保存课程单元材料,只有会员才能看到它,但是当我尝试检索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

您只能查询模型实例的多对多相关字段,而不能查询模型类。目前还不清楚"Lesson类的所有具体允许成员对象">(Lesson.allowed_memberships.all()(到底是什么。

"与任何现有课程对象相关的所有成员关系对象">,还是是"可以与课程对象关联的所有成员身份对象">

这些是不同的查询,Lesson.allowed_memberships.all()也不意味着这是不正确的用法。

如果你想要前者,像这样的东西可以工作

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

(你已经把这个作为context['lessons']了,所以用它来代替,只是展示这个想法(

我认为,一个课程可能有许多成员资格。因此您选择了所有成员资格为Lesson.allowed_memberships.all()的所有课程。

尝试选择一个课程,然后检索相关成员

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

如果您想创建自定义的类似列表的类型,最好从collections.abc.Iterable继承。它提供了处理此类容器类型所需的常见操作。不能只对任何对象/类型调用.all(),该类型定义实际上必须在类或父类中定义all()方法。

例如

class ListLike:
def __init__(self):
...
def all(self):
return some_iterator

最新更新