django外键保存

Joh*_*ohn 12 django models

我有像这样的模型.

class Mp3(models.Model):
    title=models.CharField(max_length=30)
    artist=models.ForeignKey('Artist')
Run Code Online (Sandbox Code Playgroud)

以下是Artist模型的外观:

class Artist(models.Model):
    name=models.CharField(max_length=100,default="Unknown")
Run Code Online (Sandbox Code Playgroud)

我创建了一个ID为1的艺术家.我如何创建一个分配给这位艺术家的mp3?(我想要这样的查询,例如.

mp3=Mp3.objects.get(id=50)
mp3.artist
Run Code Online (Sandbox Code Playgroud)

我试过这样的事

newMp3=Mp3(title="sth",artist=1)
Run Code Online (Sandbox Code Playgroud)

但我得到了

ValueError: Cannot assign "1": "Mp3.artist" must be a "Artist" instance.
Run Code Online (Sandbox Code Playgroud)

我理解错误但仍然不知道如何解决这个问题.感谢您的帮助.最诚挚的问候

Ric*_*llo 26

我认为从数据库中获取艺术家只是为了将它添加到Mp3模型中是不必要的,如果你已经拥有艺术家ID,你应该这样做:

new_mp3 = Mp3(title='Cool song', artist_id=the_artist_id)
new_mp3.save()
Run Code Online (Sandbox Code Playgroud)

请注意,artist参数中的_id,将外键id存储在由field_name加_id形成的字段中,这样您就可以将外键ID直接传递给该字段,而无需再次访问数据库来获取艺术家对象.

如果您不需要在代码中使用其他东西的艺术家对象,则应使用此方法.

  • 有时可能需要确保指定 id 的实例存在。在这种情况下,需要获取实例。在分配为外键之前确保实例存在并且有效将是保护数据库免受错误数据影响的好习惯 (3认同)

Sei*_*dis 15

artist = Artist.objects.get(id=1)  
newMp3 = Mp3(title="sth", artist=artist)
Run Code Online (Sandbox Code Playgroud)