Django选择多个到多个字段而不会引发错误

时间:2012-12-15 21:24:55

标签: python django

我是Django的新手。我有一个Author对象(author)和一个条目ID(entry_id),我想知道author是否是Entry的作者。

这是Entry

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    authors = models.ManyToManyField(Author)

如果我这样做

foo = Entry.objects.get(pk=entry_id, authors = author)

如果作者不是某个条目的作者,我会收到错误。

这样做的简单方法是什么?最后,我只想对作者是否是该作品的作者的问题给出是/否答案。当答案为否时,我想要一个有效的对象而不是错误。

谢谢!

5 个答案:

答案 0 :(得分:2)

根据您的问题规范:

  1.   

    最终我只是想对作者是否是该作品的作者的问题给出是/否答案。

    使用exists()

    来自文档:

      

    如果QuerySet包含任何结果,则返回True,否则返回False。   这会尝试以最简单,最快速的方式执行查询   可能,但它确实执行与普通查询几乎相同的查询   QuerySet查询。

    它不会引发任何错误,它只返回TrueFalse,因此您可以在if语句中使用它。您可以尝试以下方式:

    if Entry.objects.filter(pk=entry_id, authors=author).exists():
        # Magic here
    

    请注意,我使用filter()代替get(),因为exists()QuerySet方法(get()返回的对象不是QuerySet })

  2.   

    如果答案为否,我想要一个有效的对象,而不是错误。

    使用@nabucosound方法可能就是您想要的。

答案 1 :(得分:1)

你说你想要一个“有效对象”,所以我假设你需要这个对象来执行它。因此,缺乏对象应该执行其他事情,对吧?对于这种情况,使用Django ORM进行的最常见验证是try / except:

try:
    foo = Entry.objects.get(pk=entry_id, authors=author)
except Entry.DoesNotExist:
    # Do something when object does not exist
    pass
else:
    # Do something with your foo object

没有错,事实上,Python鼓励这种风格:

http://en.wikipedia.org/wiki/Duck_typing#In_Python

答案 2 :(得分:0)

可能像

entry = Entry.objects.get(pk=entry_id)
author in entry.authors.all()  # True or False

答案 3 :(得分:0)

count = Entry.objects.filter(pk=entry_id, authors = author).count()

if count > 0:
  #The author is an author

答案 4 :(得分:0)

您可以简单地检查Entry对象的作者...试试这个

entry = Entry.objects.get(id=entry_id)
is_author = True

try:
   entry.authors.get(id=author.id)
except:
  is_author=False