使用try inside for循环来检索对象,无异常

时间:2014-05-13 01:55:45

标签: python django exception django-forms

我正在使用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)

理想情况下,我希望没有tryexcept的逻辑是:

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)

2 个答案:

答案 0 :(得分:1)

album.artists是一个Django QuerySet对象,而不是Python dict。您需要捕获DoesNotExist异常。您可以使用以下命令将其导入当前命名空间:

from django.core.exceptions import ObjectDoesNotExist

请参阅QuerySet API reference

答案 1 :(得分:1)

而不是get()使用filter()exists()

if album.artists.filter(name='Major Lazer').exists():
    check_duplicate = True 
    break
else:
    continue