首页 > 解决方案 > Django - 计算模型中的外键

问题描述

我知道如何用注释计算事物(在我看来),但我想在模型中做同样的事情(这样它会更可重用)。

例如(让我们从 django 文档中举一个例子)我有这个模型:

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

class Publisher(models.Model):
    name = models.CharField(max_length=300)

class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.FloatField()
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    pubdate = models.DateField()

class Store(models.Model):
    name = models.CharField(max_length=300)
    books = models.ManyToManyField(Book)

我可以在视图中使用:

from django.db.models import Count
pubs = Publisher.objects.annotate(num_books=Count('book'))

但是我如何在模型中做到这一点?我知道这个问题很基本(可能),但我几乎是 django 的初学者。感谢您的回答!

标签: djangodjango-modelsdjango-views

解决方案


您可以使用自定义管理器:

Django 文档:经理

class BookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().annotate(num_books=Count('book'))

class Publisher(models.Model):
    name = models.CharField(max_length=300)
    books = BookManager()

现在你可以这样称呼它:

pubs = Publisher.books.all()

你将拥有num_books你的对象。


推荐阅读