假设我有一个物种模型'以及地理位置的模型'。
class species(models.Model):
name = models.CharField(max_length=100)
class location(models.Model):
name=models.CharField(max_length=100)
我还有第三个模型occurrences
,可以跟踪地点物种的出现情况。 (我意识到我也可以使用带有直通表的多对多字段,但这是遗留代码,所以我希望保持原样。)
class occurrences(models.Model):
species = models.ForeignKey(species)
location = models.ForeignKey(location)
理想情况下,我希望用户能够以宽表格式输入新的occurrences
。所以示意性地,html表单看起来像这样,带有复选框:
| Location1 | Location2 |
SpeciesA | x | |
SpeciesB | | x |
当提交此表单时,它将创建两个新occurrences
(位置1处的SpeciesA和位置2处的SpeciesB)。
这似乎是其他人必须拥有的用例,因为用户喜欢电子表格格式。是否有预先存在的django解决方案,允许用户以这种格式输入数据?
答案 0 :(得分:1)
与这些模型建立ManyToMany
关系不会破坏现有代码,也不会对数据库进行任何更改。事实上,您已经拥有ManyToMany
,您只需将其标记为此类。
class species(models.Model):
name = models.CharField(max_length=100)
species_locations = models.ManyToManyField(Locations,through='Occurrences')
当您运行迁移时,您会注意到它实际上并未对数据库进行任何更改。
此外,此模型中存在错误。
class occurrences(models.Model):
species = models.ForeignKey(location)
location = models.ForeignKey(location)
我相信你打算species
成为Species
问题的第二部分主要是在HTML渲染中,要使用的django组件是InlineFormSet,这样可以轻松编辑相关模型。 (如果Occcurence模型是在表格中编辑的,那么你在这里不需要ManyToMany)