Django计数对象字段

2024-04-26 11:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个字段来统计每个图书馆的注册图书数量。你知道吗

每本书都与一个图书馆有关

如果我注册或删除了一本书,它应该会自动更新到与您自己的图书馆相关的“图书计数”字段中。你知道吗

图书馆/型号.py你知道吗

from django.db import models

class Libraries(models.Model):
    name = models.CharField(max_length=50)
    book_count = models.IntegerField(default=0)

    def __str__(self):
        return self.name

书籍/型号.py你知道吗

from django.db import models

from libraries.models import Libraries

class Books(models.Model):
    library = models.ForeignKey(Libraries, on_delete=models.DO_NOTHING, blank=True, null=True)
    book = models.CharField(max_length=200, null=True, blank=True)

    def __str__(self):
        return self.book

如何在每个图书馆的模型中创建这个简单的图书柜台?你知道吗


Tags: djangofrompyimportselftruelibrariesdb
2条回答

我用信号得到的。你知道吗

@receiver(post_save, sender=Book)
def add_book_count(instance, created, **kwargs):
    if created:
        instance.library.book_count += 1
        instance.library.save()


@receiver(post_delete, sender=Book)
def rem_statement_count(instance, **kwargs):
    instance.library.book_count -= 1
    instance.library.save()

给定以下应用程序

$ tree -L 2
.
├── db.sqlite3
├── libraryapp
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── migrations
│   ├── models.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py    

以及你的模型(我做了一点重构)

$ cat libraryapp/models.py 
from django.db import models

class Library(models.Model):
    name = models.CharField(max_length=50)
    book_count = models.IntegerField(default=0)

    def __str__(self):
        return self.name

class Book(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    library = models.ForeignKey(Library, on_delete=models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return self.name

    def save(self):
        super().save()
        self.update_book_count()

    def delete(self):
        super().delete()
        self.update_book_count()

    def update_book_count(self):
        if self.library:
            self.library.book_count = self.library.book_set.count()
            self.library.save()

您可以按以下方式计算某个图书馆的图书数量:

$ python3 manage.py shell
>>> from libraryapp.models import Book, Library
>>> library = Library.objects.first()
>>> library.book_count
1

请注意,这假设更新库的图书计数的唯一方法是通过添加或删除图书。你知道吗

相关问题 更多 >