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