Django-计算模型中的外键

时间:2019-03-06 17:05:49

标签: django django-models django-views

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

例如(我从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中是个新手。 感谢您的回答!

2 个答案:

答案 0 :(得分:1)

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

Django docs: Managers

newT = interp(t ,[minVal,maxVal],[converedMinVal,converedMaxVal])  

value =  math.sin(newT * math.pi / 2)
print value,'value'

现在您可以这样称呼它:

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() 和对象。

答案 1 :(得分:0)

您可以为此使用 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查看答案,这可能对您来说是一个更好的解决方案。