【发布时间】:2014-01-07 09:14:19
【问题描述】:
我知道之前已经回答过这个问题,但是我已经完成了所有答案,但没有任何意义,或者我觉得我的代码已经在执行答案中所说的内容。
所以我有一个术语和链接的模型,它具有多对多的关系。
class ProjectTerms(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
terms = models.CharField(max_length=100)
class Meta:
db_table = 'project_terms'
class ProjectLinks(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
links = models.CharField(max_length=100)
relations = models.ManyToManyField(ProjectTerms)
class Meta:
db_table = 'project_links'
class ProjectLinksRelations(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
project_terms = models.ForeignKey('ProjectTerms')
project_links = models.ForeignKey(ProjectLinks)
脚本:
def create_models(my_term, my_link):
saved_term = ProjectTerms.objects.update_or_create(terms = my_term)
saved_link = ProjectLinks.objects.update_or_create(links = my_link)
ProjectLinksRelations.objects.update_or_create(project_terms=saved_term, project_links=saved_link)
很多地方都说模型(此处包括术语和链接)在添加到连接数据库之前必须保存。
我也尝试过分别创建每个术语和链接并像这样保存它们:
def create_models(my_term, my_link):
saved_term = ProjectTerms(terms = my_term)
saved_term.save()
saved_link = ProjectLinks(links = my_link)
saved_link.save()
relation = ProjectLinksRelations.objects.update_or_create(project_terms=saved_term, project_links=saved_link)
relation.save()
【问题讨论】:
-
通常你不需要像那样声明你的 ID 字段 - Django 隐式创建它们。您是否检查过您的 MySQL 表模式以确认您的
ProjectLinksRelation表的id列设置为自动递增?此外,由于您尚未将ProjectLinksRelation设置为ManyToManyField的through参数,因此它实际上并未与 m2m 字段挂钩 - 您可能为该关系创建了一个冗余表。 -
当我声明多对多关系然后inspectDB时,这是生成的模型代码。我检查了设置为自动增量的
ProjectLinksRelationid。虽然我刚刚注意到其他两个不是,但 MySQL 不会让我修复它们,因为它们在 1ProjectLinksRelation 中被引用。但是,如果我删除表并重新开始,django syncdb 将无法正确创建表。 -
您是否正在从数据库返回到 Django 代码?通常,inspectDB 是您用来从现有数据库启动 Django 项目的东西。
-
不,我正在从 django 创建表。我刚刚用生成的代码更新了模型。我为我的第一张桌子这样做了,我只是以为我为所有人都这样做了……我对 Django 很陌生。
-
不,通常您编写代码,从中创建表,然后将其保留。我将展示我是如何为这种关系设置模型的——其中很多应该是自动化的。
标签: mysql django python-2.7 foreign-key-relationship