Django中的ManyToManyField关系的主要关键问题

时间:2016-04-26 21:49:32

标签: python django django-models

我试图在Django中使用ManyToMany关系,几乎所有东西都完美无缺。我有资源案例研究。目标是让(案例研究)能够从资源表中提取任意数量的项目。

这是完美无缺的

  • 我可以添加资源
  • 我可以编辑资源
  • 我可以添加案例研究
  • 我可以编辑案例研究

我不能

  • 我无法删除资源
  • 我不能删除案例研究

我有一个关系表来处理这种关系:

casestudy_resource (表格)

   casestudy_id      resource_id
   1                 2
   1                 5
   1                 9

Models.py

class Resource(models.Model):
    title = models.CharField(max_length=200, null=False, blank=False)
    date = models.DateTimeField(null=False, blank=False)
    intro = models.CharField(max_length=1000, default=None, null=False, blank=True)
    file = models.FileField(upload_to=pdf_location, null=True, blank=True)

    def __unicode__(self):
        return self.title

class Casestudy(models.Model):
    title = models.CharField(max_length=400, null=False, blank=False)
    meta_keywords = models.CharField(max_length=500, null=True, blank=True)
    meta_description = models.CharField(max_length=500, null=True, blank=True)
    thumbnail = models.ImageField(upload_to=image_location, null=True, blank=True, help_text="120w x 100h")
    file = models.FileField(upload_to=pdf_location, null=True, blank=True)
    resource = models.ManyToManyField(Resource, blank=True, null=True)

    class Meta:
        verbose_name = "Case Study"
        verbose_name_plural = "Case Studies"

    def __unicode__(self):
        return self.title 

PRIMARY KEY ISSUE

从上面的代码执行删除时,我收到以下数据库异常:

no such column: casestudy_resource.id

次要问题

添加主键以修复上述列时,主键列中仅显示空值。奇怪的是,它们不像Django模型中的所有其他主键一样自动生成:

casestudy_resource (表格)

    id        casestudy_id      resource_id
    NULL      1                 2
    NULL      1                 5
    NULL      1                 9

这在处理删除资源或案例研究时会导致以下异常:

'NoneType' object has no attribute 'resource'

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容填充新的id列(仅限Postgres):

UPDATE casestudy_resource SET id = nextval(pg_get_serial_sequence('casestudy_resource','id'));

该列需要同时添加SERIALPRIMARY KEY

ALTER TABLE casestudy_resource ADD COLUMN id SERIAL;
UPDATE casestudy_resource SET id = nextval(pg_get_serial_sequence('casestudy_resource','id'));
ALTER TABLE casestudy_resource ADD PRIMARY KEY (id);