Django完整性错误 - id不能为null

时间:2013-12-18 23:49:44

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

我知道之前已经回答了这个问题,但是我已经完成了每一个答案,没有任何理由,或者我觉得我的代码已经在做了答案中所说的内容。

所以我有一个关于术语和链接的模型,它具有多对多的关系。

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

1 个答案:

答案 0 :(得分: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)

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

要设置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()