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
相关产品推荐
相关产品推荐

