Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-计算模型中的外键_Django_Django Models_Django Views - Fatal编程技术网

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

我知道如何在视图中使用annotate进行计数,但我希望在模型中也使用annotate,这样可以更好地重用

例如,让我们以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方面是个初学者。
谢谢你的回答

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

现在你可以这样称呼它:

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()