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

如何在Django中为单个模型创建多个关联关系?

Django实现用户收藏笔记的关联方案

你要的“用户收藏多个笔记”本质是多对多关联(一个用户可收藏多篇笔记,一篇笔记可被多个用户收藏),Django中没有单独的OneToManyField,且你的场景也不适合用反向多对一(会限制单篇笔记只能被一个用户收藏),以下是两种可行的规范方案:

方案一:直接使用ManyToManyField(无额外字段需求)

修改UserProfile模型,添加跨应用的多对多关联字段:

class UserProfile(models.Model):
    userObject = models.OneToOneField(User, on_delete=models.CASCADE)
    email = models.EmailField(max_length=320)
    name = models.TextField(max_length=60)
    language = models.CharField(max_length=59)
    # 关联Note模型,跨应用用字符串避免循环导入
    favorite_notes = models.ManyToManyField('notes.Note', blank=True, related_name='favorited_by')

使用示例

  • 添加收藏:user_profile.favorite_notes.add(note_instance)
  • 取消收藏:user_profile.favorite_notes.remove(note_instance)
  • 获取用户所有收藏笔记:user_profile.favorite_notes.all()
  • 反向查询笔记的收藏用户:note.favorited_by.all()

方案二:通过中间表记录额外信息(如收藏时间)

如果需要记录收藏时间、备注等额外字段,可自定义中间表,和你现有like关联的实现逻辑一致:

首先在Notes应用中创建中间模型:

class FavoriteNotes(models.Model):
    user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    note = models.ForeignKey(Note, on_delete=models.CASCADE)
    added_at = models.DateTimeField(auto_now_add=True)  # 自动记录收藏时间

    class Meta:
        unique_together = ('user_profile', 'note')  # 防止同一用户重复收藏同一笔记

然后修改UserProfile的关联字段:

class UserProfile(models.Model):
    # 原有字段...
    favorite_notes = models.ManyToManyField('notes.Note', through='notes.FavoriteNotes', related_name='favorited_by')

使用示例

  • 添加收藏:FavoriteNotes.objects.create(user_profile=user_profile, note=note_instance)
  • 获取用户收藏的笔记(包含收藏时间):
    user_profile.favorite_notes.all().annotate(favorite_time=models.F('favoritenotes__added_at'))
    
  • 反向查询笔记的收藏用户:note.favorited_by.all()

为什么不建议在Note中添加ForeignKey?

如果在Note中新增favorite_user = models.ForeignKey(UserProfile, ...),意味着单篇笔记只能被一个用户收藏,完全不符合多用户收藏的实际场景,因此该方案不可行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:47:38