2017-09-04 107 views
0

是否可以向每个ManyToMany字段选项添加一个或多个字段?Django:为每个ManyToMany字段选项添加更多字段

enter image description here

我的模型:

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) 

正如你可以在图片中看到,我在多对多字段中的选项。这些选项是:

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

我想有一个额外的文本(字符)字段旁边的每个选项(大学1 ,大学2,大学3)。

这可能吗?

EDIT 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)文件并再次应用迁移,它已修复。

+0

这可能会帮助:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships。这解决了这个问题的后端。我不确定在这种情况下是否有用于窗体小部件的现成解决方案。 –

回答

0

您可以在ManyToManyField中使用through模型(docs)。该模型可用于存储任何其他字段。

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() 
+0

谢谢你。我不知道通过模型。 所以,我试了你的代码,但现在ManyToMany字段在该engineering_courses中不再可用。 (在管理面板中)。 如果我补充一点, “ThroughModel” 在admin.py'admin.site.register(ThroughModel)'然后在管理页面打开ThroughModel,它说 'OperationalError在/管理/ theproject/throughmodel/ 没有这样的表格:theproject_throughmodel' –

+0

我认为你错过了正确的makemigrations。尝试运行makemigrations,然后迁移 – arjun27

+0

我也这样做了,但没有奏效。即使尝试通过重置迁移(通过删除迁移文件),但仍然是相同的。 –

0

再看看arjun27答案中引用的django文档。你的ThroughModel中有多个外键,所以Django很困惑。尝试在您的engineering_course模型中指定through字段,迁移更改并查看是否有效。

马克

+0

我错过了那些'through_fields'了。感谢你提醒我。虽然我尝试过这些,但它仍然给出了这个错误。我应该指出的一件事是,如果我直接单击“穿透模型”旁边的“添加”,而不是直接穿过模型页面,它会带我到页面添加内容(但保存会显示相同的错误)。我编辑了我的问题,也包括了我现在的代码,看看它也是:)〜谢谢。 –

+0

谢谢你展示那些“通过领域”:) 不幸的是,我没有足够的代表来upvote。 –