我正在使用Django对用户将音乐专辑及其曲目添加到数据库进行表格验证。两个同名专辑可以存在,只要它们与差异相关联即可。艺术家。这样,艺术家名称Beatles和Beatles Cover Band都可以在db中拥有一张名为Hard Days Night的专辑。
我已将具有相同名称的相册对象检索到名为retrieve_albums
的列表中,并使用for循环检查每个对象的艺术家。问题是当我在查询集上使用.get
时,我得到错误DoesNotExist: <object> matching query does not exist
,我说这是NameError的一种后代错误。所以我尝试放入try
块,如图所示。
>>> check_duplicate = False
>>> for album in retrieve_albums:
... try:
... if album.artists.get(name='Major Lazer'):
... check_duplicate = True
... break
... except NameError:
... pass
顺便说一句,由于这些是ManyToManyKeys,我不能只拨打album.artists(name=artist)
。
理想情况下,我希望没有try
和except
的逻辑是:
for album in retrieve_albums:
if album.artists.get(name='Major Lazer'):
check_duplicate = True
break
else:
continue
即使只是评估if语句,使用get
也会抛出一个DoesNotExist错误 - 它甚至不会到达块。我也尝试使用album.artists.get(name='Major Lazer', None)
,但获得SyntaxError: non-keyword arg after keyword arg
最好的方法是什么?
编辑:
models.py for ref。
class Artist(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
short_bio = models.CharField(max_length=2000, null=False, blank=False)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
class Album(models.Model):
name = models.CharField(max_length=150, null=False, blank=False)
artists = models.ManyToManyField(Artist)
active = models.BooleanField(default=True)
slug = models.SlugField(null=True, blank=True)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
class Track(models.Model):
name = models.CharField(max_length=200, null=False, blank=False)
albums = models.ManyToManyField(Album)
track_no = models.PositiveSmallIntegerField(null=True, blank=True)
答案 0 :(得分:1)
album.artists
是一个Django QuerySet
对象,而不是Python dict
。您需要捕获DoesNotExist
异常。您可以使用以下命令将其导入当前命名空间:
from django.core.exceptions import ObjectDoesNotExist
答案 1 :(得分:1)
而不是get()
使用filter()
和exists()
:
if album.artists.filter(name='Major Lazer').exists():
check_duplicate = True
break
else:
continue