django - 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 的初学者。感谢您的回答!
解决方案
您可以使用自定义管理器:
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
你的对象。
推荐阅读
- java - 如何在 Adroid Studio 中获取嵌套微调器的索引?
- php - PHP 致命错误:您必须启用 intl 扩展才能使用 CakePHP。蛋糕版本 4,PHP 版本 7.4
- python - 是否可以在 ArgumentParser 中的操作后运行类型?
- graphics - 金属混合 alpha 低于 0.5
- python - Python 链表 - 插入方法
- sql-server - Blazor 服务器应用程序;在浏览器中刷新作为类的属性返回 nul
- mysql - Amcharts v4 MySQL 不显示图表
- java - java中多个实体类使用的serialVersionUID具有相同的值
- javascript - Vue JS中数量为零时无法禁用按钮
- azure - 具有重试计数的问题在 powershell 中起作用