You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django实现学生院校收藏功能应在哪里定义ManyToMany关系?

现有设计的问题

你当前单独创建Wishlist模型的设计是不合理的,缺少和Student的关联字段,根本无法知道某条心愿单记录属于哪个学生,完全达不到你的业务需求。

最优方案(匹配你当前的核心需求)

你不需要单独创建Wishlist模型,直接把多对多字段定义在Student模型里即可,完全满足点击爱心添加/移除院校的需求:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)
    # 其余原有字段
    # 心愿单多对多关联院校
    wished_universities = models.ManyToManyField(
        "University",
        related_name="students_wished",
        blank=True
    )

class University(models.Model):
    name = models.CharField(max_length=100)
    # 其余原有字段

对应的业务操作代码非常简洁:

  • 添加院校到心愿单:student.wished_universities.add(university_instance)
  • 从心愿单移除院校:student.wished_universities.remove(university_instance)
  • 判断用户是否已收藏该院校:student.wished_universities.filter(id=university_id).exists(),可以直接用来判断爱心点击时执行添加还是移除逻辑

什么时候需要单独创建Wishlist模型

只有当你需要给收藏关系新增额外属性的时候,才需要自定义中间表,比如要记录收藏时间、给收藏的院校加备注、设置收藏优先级这类需求,才需要单独定义Wishlist模型:

class Student(models.Model):
    name = models.CharField(max_length=100)
    wished_universities = models.ManyToManyField(
        "University",
        through="Wishlist",
        related_name="students_wished",
        blank=True
    )

class University(models.Model):
    name = models.CharField(max_length=100)

class Wishlist(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    university = models.ForeignKey(University, on_delete=models.CASCADE)
    # 额外需要的扩展字段
    added_at = models.DateTimeField(auto_now_add=True)
    remark = models.CharField(max_length=200, blank=True)

你当前没有扩展字段的需求,用默认多对多字段放在Student模型里是开发效率、性能最优的选择。

内容的提问来源于stack exchange,提问作者sixovov947

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:39:00