使用Django ORM查找不是任何外键目标的对象

时间:2018-09-05 21:40:12

标签: python django

我有两个模型,AuthorBook。我需要让所有Author都没有Books的人使用Django的ORM。我该怎么办?

这是我的模特:

class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()


class Book(models.Model):
    name = models.CharField(max_length=500)
    author = models.ForeignKey(Author, related_name='books')

我目前正在使用for循环来执行此操作,但是我更喜欢使用ORM:

for person in Author.objects.all():
    if person.books.count() == 0:
        "something code"

但是它需要对对象进行更新。

我尝试了这个,但是我得到一个空的QuerySet

Author.objects.select_related('books').values('id').annotate(books_count=Count('id')).filter(books_count=0)

1 个答案:

答案 0 :(得分:0)

.annotate(books_count=Count('id'))

Django将在此处计算 Author id。试试

.annotate(books_count=Count('books__id'))

相反。双下划线表示query that spans relationships

  

Django提供了一种强大而直观的方式来“跟踪”查找中的关系,并在幕后自动为您处理SQL JOIN。要建立关系,只需在各个模型之间使用相关字段的字段名称,并用双下划线将其隔开,直到找到所需的字段为止。

     

此示例使用EntryBlog的{​​{1}}检索所有name个对象:

'Beatles Blog'