contenttypes反向通用關系

前言

  • 現實的需求是, 想要算出前七天熱門的博客是哪些, 并計算數量
  • 我已經寫好一個contenttypes模型用與計算每天博客的閱讀次數
class ReadDetail(models.Model):
    """
    瀏覽量按日統計
    """
    date = models.DateField(default=timezone.now, verbose_name='日期')
    read_num = models.IntegerField(default=0, verbose_name='閱讀次數')

    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING, verbose_name='類型')
    object_id = models.PositiveIntegerField(verbose_name='博客id')
    content_object = GenericForeignKey('content_type', 'object_id')
    # 如果這些字段名為“content_type”和“object_id”,則可以省略

    def show_content(self):
        return "標題:  %s" %(self.content_object.title)

    class Meta:
        verbose_name = "訪問量統計"
        verbose_name_plural = verbose_name

反向通用關系

類GenericRelation

from django.contrib.contenttypes.fields import GenericRelation

class Blog(models.Model, ReadNumExpandMethod):
    read_details = GenericRelation(ReadDetail)
    title = models.CharField(max_length=50, verbose_name="標題")
  • Blog每個實例都有一個read_details屬性,可以用來檢索它們的關聯ReadDetail
def get_7days_hot_blog():
    """
    獲取前七天熱門博客
    :return:
    """
    today = timezone.datetime.now()
    date = today - datetime.timedelta(days=7)
    blog = Blog.objects.filter(read_details__date__gte=date, read_details__date__lt=today) \
                        .values('id', 'title',).annotate(read_num_sum = Sum('read_details__read_num')) \
                        .order_by('-read_num_sum')
    return blog[:7]

values: 返回一個QuerySet在用作iterable時返回字典而不是模型實例。
每個字典代表一個對象,其中的鍵對應于模型對象的屬性名稱。(官方解釋)

<QuerySet [{'id': 33, 'title': 'Django restframework'}, 
{'id': 23, 'title': 'for 20'}, {'id': 20, 'title': 'for 17'},
 {'id': 4, 'title': 'for 1'}, {'id': 3, 'title': 'for 29'}, 
{'id': 1, 'title': '學習'}, {'id': 1, 'title': '學習'}]>

annotate :每個參數都是一個注釋,將被添加到QuerySet返回的每個對象中。

<QuerySet [{'id': 33, 'title': 'Django restframework', 'read_num_sum': 1},
 {'id': 23, 'title': 'for 20', 'read_num_sum': 7}, 
{'id': 20, 'title': 'for 17', 'read_num_sum': 1},
 {'id': 4, 'title': 'for 1', 'read_num_sum': 6}, 
{'id': 3, 'title': 'for 29', 'read_num_sum': 5}, 
{'id': 1, 'title': '學習', 'read_num_sum': 2}]>
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容