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