保存Django外键

16

我有一个长这样的Mp3模型。

class Mp3(models.Model):
    title=models.CharField(max_length=30)
    artist=models.ForeignKey('Artist')

这是Artist模型的外观:

class Artist(models.Model):
    name=models.CharField(max_length=100,default="Unknown")

我已经创建了ID为1的艺术家。如何创建一个分配给这位艺术家的mp3?(我想将其用于像这样的查询。例如)

mp3=Mp3.objects.get(id=50)
mp3.artist

我已经尝试过这样的东西

newMp3=Mp3(title="sth",artist=1)

但是我收到了这个错误信息

ValueError: Cannot assign "1": "Mp3.artist" must be a "Artist" instance.

我理解这个错误,但仍然不知道如何解决。感谢任何帮助。 最好的问候


4
你能否在这里发布答案,以便问答内容完整并为后代留下记录? - OmerGertel
5个回答

39

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

new_mp3 = Mp3(title='Cool song', artist_id=the_artist_id)
new_mp3.save()

请注意,艺术家参数中的_id,Django将外键id存储在由field_name加上_id组成的字段中,因此您可以直接将外键id传递到该字段,而无需再次访问数据库以获取艺术家对象。

如果您的代码中不需要艺术家对象用于其他事情,则应使用此方法。


3
有时需要确保指定id的实例存在。在这种情况下,获取实例是可取的。在将其分配为外键之前,确保实例存在且有效是一种保护数据库免受错误数据的良好实践。 - Mohammed Shareef C

20
artist = Artist.objects.get(id=1)  
newMp3 = Mp3(title="sth", artist=artist)

3
答案是:
newMp3=Mp3(title="sth", artist=the_artist)

其中'the_artist'是Artist的一个实例。


2

首先,创建或获取一个艺术家对象。

artist = Artist.objects.create(name="艺术家姓名")

或者

artist = Artist.objects.get(id=artist.id) 

那么

newMp3 = Mp3(title="sth", artist=artist)

0
答案是:

artist_id = Artist.objects.filter(id=1).first()
new_mp3 = Mp3(title="sth", artist_id=artist_id)
new_mp3.save()

artist_id=artist_id(左侧的值将从Mp3 fk中获取艺术家ID)

我来晚了...对此感到抱歉!


输入了两次“对象”。 - joshlsullivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接