在Django中添加属性多对多关系

时间:2018-07-12 20:38:29

标签: python django python-3.x django-rest-framework

我有以下Django模型:

class Lesson(models.Model):
    title = models.TextField()

class Course(models.Model):
    lessons = models.ManyToManyField(Lesson)

class User(AbstractUser):
    favorites = models.ManyToManyField(Lesson)

我有一条路线/ courses / course_id,该路线返回的课程详细信息包括一系列课程(使用Django Rest Framework)

如何根据用户的收藏夹在课程对象中返回其他属性收藏夹。

我尝试了以下操作:

course = self.get_object(course_id)
favorites = request.user.favorites

for lesson in course.lessons.all():
    if lesson in favorites.all():
        lesson.favorite = True

serializer = CourseDetailSerializer(course, context=serializer_context)
return Response(serializer.data)

但是返回时不起作用:

  

(django.core.exceptions.ImproperlyConfigured:字段名称favorite是   对于模型Lesson无效。

我的序列化器:

class CourseDetailSerializer(serializers.HyperlinkedModelSerializer):
    lessons = LessonListSerializer(many=True, read_only=True)

    class Meta:
        model = Course
        fields = ('id', 'lessons', 'name', 'title')


class LessonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Lesson
        fields = ('id', 'title', 'duration', 'favorite')

2 个答案:

答案 0 :(得分:0)

如果未定义对象,则无法向其添加属性,例如:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id=add>add button</button>
<div id="container"></div>

创建m2m关系时:

lesson.favorite = True

... django创建虚拟模型,该虚拟模型仅存储两个模型中的主键对。这种关系在数据库中可能看起来像这样:

favorites = models.ManyToManyField(Lesson)

我想您想要实现的是添加有关此关系的更多信息。 因此,您需要使用该额外字段创建中介模型,即:

  id  | user_id       | lesson_id 
------+---------------+----------
  151 |            11 |     3225
  741 |            21 |     4137

答案 1 :(得分:0)

您的lesson模型不包含favourite布尔值,因此调用lesson.favorite = True时无法设置布尔值

如果要消除错误,请尝试:

class Lesson(models.Model):
    title = models.TextField()
    favorite = models.BooleanField(initial=False)

尽管这些课程似乎不是针对特定用户的。因此,此解决方案可能不是您要寻找的解决方案,因为如果仅 ,它将为 所有 个用户将“课程”的“收藏夹”字段设置为true一个 用户将其设置为收藏。