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

Django模型使用ForeignKey时如何为字段添加多个关联值?

结论
  • 不能直接通过现有写法的ForeignKey实现单个视频关联多个分类的需求。ForeignKey属于多对一关联字段,仅支持多个Video实例绑定同一个Category,无法实现单个Video绑定多个Category。
实现方案

Django中实现多对多关联有两种常用方式:

方案1:使用原生ManyToManyField(推荐)

无需手动创建中间表,Django会自动维护映射关系,代码最简洁:

class Video(models.Model):
    # 多对多字段绑定Category,related_name用于反向从分类查所属视频
    categories = models.ManyToManyField('Category', related_name='videos')

class Category(models.Model):
    category = models.CharField(max_length=100)

操作示例:

# 创建测试数据
video1 = Video.objects.create()
drama = Category.objects.create(category='drama') # 剧情分类
terror = Category.objects.create(category='terror') # 恐怖分类

# 给视频绑定两个分类
video1.categories.add(drama, terror)

# 查询该视频的所有分类,会返回剧情、恐怖两个分类对象
video1.categories.all()

方案2:手动创建中间表(用两个ForeignKey实现)

如果需要给两个模型的关联关系加额外字段(比如关联时间、关联操作人等),可以手动创建中间表,通过两个ForeignKey分别关联Video和Category:

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

class Category(models.Model):
    category = models.CharField(max_length=100)

# 手动定义的中间关联表
class VideoCategoryRel(models.Model):
    video = models.ForeignKey(Video, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # 可按需新增关联相关的扩展字段,比如:
    # create_time = models.DateTimeField(auto_now_add=True)

操作示例:

# 创建测试数据
video1 = Video.objects.create(name='测试视频1')
drama = Category.objects.create(category='drama')
terror = Category.objects.create(category='terror')

# 创建两条关联记录实现单视频绑定两个分类
VideoCategoryRel.objects.create(video=video1, category=drama)
VideoCategoryRel.objects.create(video=video1, category=terror)

# 查询该视频的所有分类
Category.objects.filter(videocategoryrel__video=video1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:54:03