【问题标题】:Django: Adding more fields to each ManyToMany Field optionDjango:为每个 ManyToMany Field 选项添加更多字段
【发布时间】:2025-11-26 22:15:02
【问题描述】:

是否可以为每个 ManyToMany 字段选项添加一个或多个 Char 字段?

我的模特:

class engineeringUni(models.Model):
    field2 = models.CharField(max_length=200)
    des_eng = models.CharField(max_length=1000, default='Add description')


    def __str__(self):
        return self.field2

    def description_eng_universities(self):
        return self.des_eng

class engineering_courses(models.Model):
    course_name = models.CharField(max_length=400)
    course_description = models.CharField(max_length=1000, default='This is a description')
    course_offered_by = models.ManyToManyField(engineeringUni, related_name='course_offered_by')
    course_duration = models.IntegerField(blank=False, default='2')

    def __str__(self):
        return self.course_name

    def description_course(self):
        return self.course_description

    def offered_by_courses(self):
        return self.course_offered_by

    def duration_courses(self):
        return str(self.course_duration)

正如您在图片中看到的,我在 ManyToMany 字段中有选项。这些选项是:

  • 大学 1
  • 大学 2
  • 大学 3

我想要的是每个选项(大学 1、大学 2、大学 3)旁边的附加文本(字符)字段。

这可能吗?

编辑 1:

当前代码:

class engineering_courses(models.Model):
    course_name = models.CharField(max_length=400)
    course_description = models.CharField(max_length=1000, default='This is a description')
    course_offered_by = models.ManyToManyField(
        engineeringUni, 
        through='ThroughModel', 
        through_fields=('course', 'university'),
        )
    course_duration = models.IntegerField(blank=False, default='2')



    def __str__(self):
        return self.course_name

    def description_course(self):
        return self.course_description

    def offered_by_courses(self):
        return self.course_offered_by

    def duration_courses(self):
        return str(self.course_duration)



class ThroughModel(models.Model):
    course = models.ForeignKey(engineering_courses, on_delete=models.CASCADE)
    university = models.ForeignKey(engineeringUni, on_delete=models.CASCADE)
    additional_text = models.CharField(max_length=200)

编辑 2: 问题已修复。我没有收到表错误,因为我已经删除了迁移文件并在删除数据库(db.sqlite3)文件并再次应用迁移时,它已修复。

【问题讨论】:

标签: python django


【解决方案1】:

您可以在 ManyToManyField (docs) 中使用 through 模型。此模型可用于存储任何附加字段。

class engineering_courses(models.Model):
    # ...
    course_offered_by = models.ManyToManyField(engineeringUni, related_name='course_offered_by', through='ThroughModel')


class ThroughModel(models.Model):
    course = models.ForeignKey(engineering_courses)
    university = models.ForeignKey(engineeringUni)
    additional_text = models.CharField()

【讨论】:

  • 谢谢你。我不知道通过模型。因此,我尝试了您的代码,但现在该工程课程中不再提供 ManyToMany 字段。 (在管理面板中)。如果我在 admin.py admin.site.register(ThroughModel) 中添加“ThroughModel”,然后在管理页面中打开 ThroughModel,它会显示 OperationalError at /admin/theproject/throughmodel/ no such table: theproject_throughmodel
  • 我认为你错过了正确的 makemigrations。尝试运行 makemigrations 然后迁移
  • 我也这样做了,但是没有用。甚至尝试通过重置迁移(通过删除迁移文件)但仍然相同。
  • 感谢您通过模型让我意识到这一点 :)
【解决方案2】:

再看一下 arjun27 的答案中引用的 django 文档。您的 ThroughModel 中有多个外键,因此 django 很困惑。尝试在您的 engineering_course 模型中指定 through 字段,迁移更改,看看是否可行。

标记

【讨论】:

  • 我又错过了那些“through_fields”。谢谢你提醒我。虽然我尝试了那些它仍然给出了那个错误。我应该指定的一件事是,如果我直接单击“通过模型”旁边的“添加”而不是转到“通过模型”页面,它确实需要我到页面添加内容(但保存会显示相同的错误)。我已经编辑了我的问题并包含了我现在的代码,也看看它:) ~ 谢谢。
  • 感谢您展示这些“通过字段”:) 不幸的是,我没有足够的代表来投票。
最近更新 更多