【问题标题】:Django Integrity Error - id cannot be nullDjango 完整性错误 - id 不能为空
【发布时间】: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 设置为 ManyToManyFieldthrough 参数,因此它实际上并未与 m2m 字段挂钩 - 您可能为该关系创建了一个冗余表。
  • 当我声明多对多关系然后inspectDB时,这是生成的模型代码。我检查了设置为自动增量的ProjectLinksRelation id。虽然我刚刚注意到其他两个不是,但 MySQL 不会让我修复它们,因为它们在 1ProjectLinksRelation 中被引用。但是,如果我删除表并重新开始,django syncdb 将无法正确创建表。
  • 您是否正在从数据库返回到 Django 代码?通常,inspectDB 是您用来从现有数据库启动 Django 项目的东西。
  • 不,我正在从 django 创建表。我刚刚用生成的代码更新了模型。我为我的第一张桌子这样做了,我只是以为我为所有人都这样做了……我对 Django 很陌生。
  • 不,通常您编写代码,从中创建表,然后将其保留。我将展示我是如何为这种关系设置模型的——其中很多应该是自动化的。

标签: mysql django python-2.7 foreign-key-relationship


【解决方案1】:

您只需要:

class ProjectTerms(models.Model):
    terms = models.CharField(max_length=100)

class ProjectLinks(models.Model):
    links = models.CharField(max_length=100)
    relations = models.ManyToManyField(ProjectTerms)

ManyToManyField 的 ID 字段和表将自动创建。

要设置ManyToMany 关系,请使用add

def create_models(my_term, my_link):
    (saved_term, created) = ProjectTerms.objects.update_or_create(terms = my_term)
    (saved_link, created) = ProjectLinks.objects.update_or_create(links = my_link)
    saved_link.relations.add(saved_term)
    saved_link.save()

【讨论】:

  • 为了确定,我删除了现有的表,将我的模型更改为这个。在同步数据库时,虽然它坚持要创建第三个表。我再次放弃了一切以使用 migrate db 并且它正在做同样的事情。
  • 创建第三个 table 很好,也符合预期。您不需要的是明确的第三个模型
  • 啊,好吧。我现在唯一的问题是,当我尝试将术语与链接相关联时,它说“元组”对象没有属性“关系”。
  • 哦,对了。 update_or_create 返回一个元组,指示它是否创建了新对象,以及对象本身。我会解决的。此外,update_or_create 是开发版本的新成员 - get_or_create 是我可能会使用的,因为我更习惯了它,因为您没有使用它来实际更新。
  • 我已经解决了这个问题,这已在 stackoverflow 上得到了回答 :) 那行得通!谢谢谢谢谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2015-06-17
  • 1970-01-01
  • 2019-10-06
  • 2012-11-15
相关资源
最近更新 更多