Django-计算模型中的外键
我知道如何在视图中使用annotate进行计数,但我希望在模型中也使用annotate,这样可以更好地重用 例如,让我们以django文档为例,我有这个模型:Django-计算模型中的外键,django,django-models,django-views,Django,Django Models,Django Views,我知道如何在视图中使用annotate进行计数,但我希望在模型中也使用annotate,这样可以更好地重用 例如,让我们以django文档为例,我有这个模型: class Author(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class Publisher(models.Model): name = models.CharField(max_le
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方面是个初学者。
谢谢你的回答 您可以使用自定义管理器: 现在你可以这样称呼它:
pubs = Publisher.books.all()
您的对象将包含num_books。您可以使用classmethod进行此操作
class Publisher(models.Model):
...
@classmethod
def get_book_count(cls):
return cls.objects.annotate(num_books=Count('book'))
您可以将此方法称为
pubs = Publisher.get_book_count()
编辑-还可以通过@Navid2zp查看答案,这可能是一个更好的解决方案
pubs = Publisher.get_book_count()