【问题标题】:Django: How to save data to ManyToManyField?Django:如何将数据保存到 ManyToManyField?
【发布时间】:2012-04-28 17:51:34
【问题描述】:

我对以下型号有疑问。我想从views.py 中填充ManyToManyField,而不是从Admin 中填充。

但是如何将数据添加到genres 字段,即ManyToManyField

views.py

content = Movie_Info(id = m_id,
                    title = data[0].get('title'),
                    overview = data[0].get('overview'),
                    release_date = data[0].get('release_date'),
                )
content.save()

models.py

class Movie_Info_genre(models.Model):
    genre = models.CharField(max_length=100)

class Movie_Info(models.Model):
    id             = models.IntegerField(primary_key=True)
    title          = models.CharField(max_length=100, blank=True, null=True)
    overview       = models.TextField(blank=True, null=True)
    release_date   = models.CharField(max_length=10, blank=True, null=True)
    genres         = models.ManyToManyField(Movie_Info_genre)

【问题讨论】:

  • 不相关的风格建议:在 Python/Django 中,强烈倾向于将类命名为 MovieInfoMovieInfoGenre(或只是 MovieGenre 甚至 Genre),而不是在此处使用下划线。此外,这可能是一个 SO 格式问题,但在制作content 时,缩进量非常可笑。 :) 另外,release_date 应该是 DateField
  • @Dougal,感谢您的建议。关于缩进,我正在使用一个为我做的插件;)
  • 另外,模型中不需要特殊的“id”字段。 Django 会自动为您完成。

标签: django django-models


【解决方案1】:

使用add method for related fields

# using Model.object.create is a shortcut to instantiating, then calling save()
myMoveInfo = Movie_Info.objects.create(title='foo', overview='bar')
myMovieGenre = Movie_Info_genre.objects.create(genre='horror')
myMovieInfo.genres.add(myMoveGenre)

与修改其他字段不同,这两个模型在执行此操作之前都必须存在于数据库中,因此您必须在添加多对多关系之前调用save。由于add会立即影响数据库,所以以后不需要保存。

【讨论】:

  • 谢谢,我对此也有进一步的疑问。流派应该是独一无二的。使用以下代码,如果添加两次相同的流派,则会引发错误。所以我想知道,我是否应该抓住那个错误并采取一些措施。或者有没有更好的方法来解决这个问题?
  • “添加立即影响数据库”是我正在寻找的答案,谢谢
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2019-02-06
  • 2017-10-08
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多