【问题标题】:ManyToMany Relationship between two models in DjangoDjango中两个模型之间的ManyToMany关系
【发布时间】:2020-05-02 21:53:07
【问题描述】:

我正在尝试建立一个网站,用户可以添加他们正在学习的课程。我想知道我应该如何添加 ManyToMany 关系。这样我们就可以根据课程代码或讲师或任何领域获得课程中的所有用户。我们还可以获取用户注册的课程。目前,我的数据库结构是:

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_university = models.CharField(max_length=100)
    course_instructor = models.CharField(max_length=100)
    course_year = models.IntegerField(('year'), validators=[MinValueValidator(1984), max_value_current_year])

    def __str__(self):
        return self.course_code

和我的用户模型:

class Profile(AbstractUser):
    bio = models.TextField()
    image = models.ImageField(default='defaults/user/default_u_i.png', 
    courses = models.ManyToManyField('home.Course',related_name='courses')

    def __str__(self):
        return self.username

我想知道 ManyToMany 关系应该在用户模型还是课程模型中?还是会产生任何影响?

编辑:为了向帖子对象添加课程,我现在正在使用此视图,但它似乎不起作用:

@login_required
def course_add(request):

    if request.method == "POST":
        form = CourseForm(request.POST or none)
        if form.is_valid():
            course = form.save()
            request.user.add(course)
    else:
        form = CourseForm
    context = {
        'form':form
    }
    return render(request,'home/courses/course_add.html', context)

【问题讨论】:

  • 不会有太大区别。 Django 将创建一个额外的表,其中包含模型的两个外键。剩下的只是 Django 在模型中添加相关的管理器,让 ORM 查询更方便。
  • 所以我目前的模型是正确的?我可以同时检索用户课程和课程中的用户吗?
  • 那么related_name 需要更改,例如profiles
  • 在这里链接this question。他们是相关的,解决了我作为一对夫妇的问题。

标签: python django django-models django-forms


【解决方案1】:

对于关系数据库,您定义ManyToManyField 的模型无关紧要。 Django 将创建一个额外的表,其中包含两个ForeignKeys 到由ManyToManyField 链接的两个模型。

添加的相关管理器等都是Django的逻辑。在窗帘后面,它会查询中间的表。

但是,您需要修复 related_name=… parameter [Django-doc]related_namereverse 中指定关系的名称,因此在这种情况下从 CourseProfile。因此它应该类似于'profiles':

class Profile(AbstractUser):
    bio = models.TextField()
    image = models.ImageField(default='defaults/user/default_u_i.png', 
    courses = models.ManyToManyField('home.Course', related_name='profiles')

    def __str__(self):
        return self.username

因此,您可以通过以下方式获取参与Course 对象的人员:

mycourse<b>.profiles.all()</b>

您可以访问courses 注册的Profile

myprofile<b>.courses.all()</b>

有关详细信息,请参阅Many-to-many relationships section of the documentation

您可以通过以下方式将课程添加到用户的课程中:

@login_required
def course_add(request):
    if request.method == 'POST':
        form = CourseForm(request.POST)
        if form.is_valid():
            course = form.save()
            request.user.courses.add(course)
    else:
        form = CourseForm()
    context = {
        'form': form
    }
    return render(request,'home/courses/course_add.html', context)

【讨论】:

  • 我现在也面临一个问题,如何向用户添加课程对象我已经为其编写了一个视图,我不确定它是否正确实施。
  • 您可以使用myprofile.courses.add(mycourse) 添加课程。 myprofilemycourse 首先需要添加到数据库中。这在文档中进行了解释:docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many
  • 是否有记录表明将创建一个额外的表?我在自己的项目中看到过,但在文档中没有看到。
  • @Aalexander:是的,请参阅ManyToManyFieldDatabase Representation section
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多