Python 如何通过对列表中的相关项进行计数来更新实例列表?

Python 如何通过对列表中的相关项进行计数来更新实例列表?,python,django-rest-framework,Python,Django Rest Framework,我想用指向该类别的图书链接总数更新实例列表 答复如下所述。例如,我有一些与“历史”相关的书籍。如何在每次呼叫时更新列表上的总数 [ { "id": 1, "category_name": "History", "category_code": "his", "is_tab": true, "add_time": "2020-03-02T15:56:58.469917Z", "total_num

我想用指向该类别的图书链接总数更新实例列表

答复如下所述。例如,我有一些与“历史”相关的书籍。如何在每次呼叫时更新列表上的总数

[
    {
        "id": 1,
        "category_name": "History",
        "category_code": "his",
        "is_tab": true,
        "add_time": "2020-03-02T15:56:58.469917Z",
        "total_number": 0
    },
    {
        "id": 2,
        "category_name": "Romance",
        "category_code": "ROM",
        "is_tab": true,
        "add_time": "2020-05-22T17:02:47.919479Z",
        "total_number": 0
    },
    {
        "id": 3,
        "category_name": "Sci-fic",
        "category_code": "S-F",
        "is_tab": true,
        "add_time": "2020-05-22T17:04:57.896846Z",
        "total_number": 0
    }
]
序列化程序.py

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = BookCategory
        fields = ('id', 'category_name', 'category_code', "is_tab", 'add_time', 'total_number')
view.py

class BookCategoryDetailView(ListCreateAPIView, RetrieveModelMixin):
    queryset = BookCategory.objects.all()
    serializer_class = CategorySerializer
model.py

class BookCategory(models.Model):
    category_name = models.CharField(default="", max_length=30, verbose_name='Category name')
    category_code = models.CharField(default="", max_length=30, verbose_name='Category code')
    is_tab = models.BooleanField(default=False, verbose_name='is Navigate')
    add_time = models.DateTimeField(auto_now_add=True, verbose_name='Added time')
    total_number = models.BigIntegerField(default=0, verbose_name='Total Number', editable=False)

    class Meta:
        verbose_name = 'Type Category'
        verbose_name_plural = verbose_name
        db_table = 'Book Genre'

    def __str__(self):
        return self.category_name
图书模型

class Book(models.Model):
    BOOK_STATUS = (
        ('Ongoing', u'Ongoing'),
        ('Completed', u'Completed')
    )
    book_name = models.CharField(default="", max_length=30, verbose_name='Book name', unique=True)
    book_image = models.ImageField(default="", max_length=30, verbose_name='Book image')
    book_status = models.CharField(choices=BOOK_STATUS, default='Ongoing', verbose_name='Book Status', max_length=150,
                                   null=True)
    book_author = models.ForeignKey(settings.AUTH_USER_MODEL,
                                    on_delete=models.SET_NULL,
                                    verbose_name='author',
                                    related_name='author',
                                    null=True)
    book_type = models.ForeignKey(BookCategory,
                                  on_delete=models.CASCADE,
                                  verbose_name='book type',
                                  related_name='book_type',
                                  null=True)
    book_short_description = models.TextField(verbose_name='Short description', default='')
    book_description = models.TextField(verbose_name='Book Description', default='')
    # non-editable values
    total_words = models.IntegerField(verbose_name='Total_words', default=0, editable=False)
    chapter_count = models.IntegerField(verbose_name='Chapter Count', default=0, editable=False)
    total_vote = models.IntegerField(verbose_name='Total vote', default=0, editable=False)
    weekly_vote = models.IntegerField(verbose_name='Weekly vote', default=0, editable=False)
    total_click = models.IntegerField(verbose_name='Total Click', default=0, editable=False)
    fav_num = models.IntegerField(verbose_name='Total favorite number', default=0, editable=False)
    added_time = models.DateTimeField(verbose_name='Added time', auto_now_add=True, editable=False)
    last_update = models.DateTimeField(verbose_name='last update', auto_now=True, editable=False)

    def get_chapter_number(self):
        chapter_count = Chapter.objects.filter(self.id).count()
        return chapter_count

    def get_book_name(self):
        return self.book_name

    class Meta:
        db_table = 'Books'
        verbose_name = 'Novel'
        verbose_name_plural = verbose_name

任何帮助都将不胜感激

一个常见的误解是给th起了与关系本身相同的名字。
related\u name
是反向关系的名称,因此Django创建的关系可以从给定的
BookCategory
中获取
Book
s。因此,您可以将其重命名为:

class Book(models.Model):
    # …
    book_author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        verbose_name='author',
        related_name='authored_books',
        null=True
    )
    book_type = models.ForeignKey(
        BookCategory,
        on_delete=models.CASCADE,
        verbose_name='book type',
        related_name='books',
        null=True
    )
    # …
这意味着由此查询集生成的
BookCategory
s将具有一个额外的属性
.total\u number
,该属性包含相关
Book
对象的数量

接下来,我们可以更新serialzier以使用此
总数

class CategorySerializer(serializers.ModelSerializer):
    total_number = serializers.IntegerField(read_only=True)
    class Meta:
        model = BookCategory
        fields = ('id', 'category_name', 'category_code', "is_tab", 'add_time', 'total_number')

一个常见的误解是,给th起的名字与关系本身的名字相同。
related\u name
是反向关系的名称,因此Django创建的关系可以从给定的
BookCategory
中获取
Book
s。因此,您可以将其重命名为:

class Book(models.Model):
    # …
    book_author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        verbose_name='author',
        related_name='authored_books',
        null=True
    )
    book_type = models.ForeignKey(
        BookCategory,
        on_delete=models.CASCADE,
        verbose_name='book type',
        related_name='books',
        null=True
    )
    # …
这意味着由此查询集生成的
BookCategory
s将具有一个额外的属性
.total\u number
,该属性包含相关
Book
对象的数量

接下来,我们可以更新serialzier以使用此
总数

class CategorySerializer(serializers.ModelSerializer):
    total_number = serializers.IntegerField(read_only=True)
    class Meta:
        model = BookCategory
        fields = ('id', 'category_name', 'category_code', "is_tab", 'add_time', 'total_number')

请不要在
BookCategory
中存储
Book
的编号,您可以通过查询(对于所有
BookCategory
s)计算该编号。您可以共享相关模型吗?@WillemVanOnsem我已经更新了model.pyThanks@ThimothyShen:还有
模型?@WillemVanOnsem Hi我已经添加了它,谢谢。请不要将
图书
的数量存储在
图书类别
中,您可以通过查询(对于所有
图书类别
进行计算)。您可以共享相关模型吗?@WillemVanOnsem我已更新了模型。pyThanks@ThimothyShen:还有
模型?@WillemVanOnsem-Hi我添加了它,谢谢。
from django.db.models import Count

class BookCategoryDetailView(RetrieveModelMixin, ListCreateAPIView):
    queryset = BookCategory.objects.annotate(total_number=Count('books'))
    serializer_class = CategorySerializer