为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用基于类的视图继承来覆盖父类?

如何使用基于类的视图继承来覆盖父类?

繁星淼淼 2022-06-14 15:21:03
在我的 ShowChart 中有一个名为 Electronic(Electronic.objects.values..etc) 的模型,在我的继承类(ChartElectrical) 中,它需要更改为 Electrical (Electronic.objects.values..etc),这里我只是传递它。我不知道该怎么做 class ShowChart(View):   def get(self, request):    my_count = Electrical.objects.values('allocated_time')\        .annotate(complete=Count('allocated_time', filter=Q(batch_18=True)),                  not_complete=Count('allocated_time',                    filter=Q(batch_18=False)),                  complete_1=Count('allocated_time',                        filter=Q(batch_19=True)),                  not_complete_1=Count('allocated_time',                   filter=Q(batch_19=False)),                  complete_2=Count('allocated_time',                      filter=Q(batch_20=True)),                  not_complete_2=Count('allocated_time',                    filter=Q(batch_20=False)),                  complete_3=Count('allocated_time',                    filter=Q(batch_21=True)),                  not_complete_3=Count('allocated_time',                 filter=Q(batch_21=False)))    c_batch_18 = list()    n_batch_18 = list()    c_batch_19 = list()    n_batch_19 = list()    c_batch_20 = list()    n_batch_20 = list()    c_batch_21 = list()    n_batch_21 = list()    for entry in my_count:        c_batch_18.append(entry['complete'] * entry['allocated_time'])        n_batch_18.append(entry['not_complete'] * entry['allocated_time'])        c_batch_19.append(entry['complete_1'] * entry['allocated_time'])        n_batch_19.append(entry['not_complete_1'] * entry['allocated_time'])        c_batch_20.append(entry['complete_2'] * entry['allocated_time'])        n_batch_20.append(entry['not_complete_2'] * entry['allocated_time'])        c_batch_21.append(entry['complete_3'] * entry['allocated_time'])        n_batch_21.append(entry['not_complete_3'] * entry['allocated_time'])  
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

我认为您应该my_count以另一种方法移动视图的一部分,然后在子视图中覆盖它。像这样:


class ShowChart(View):

   def get_my_count(self):

      my_count = Electrical.objects.values('allocated_time')\

        .annotate(complete=Count('allocated_time', filter=Q(batch_18=True)),

                  not_complete=Count('allocated_time', 

                   filter=Q(batch_18=False)),

                  complete_1=Count('allocated_time', 

                       filter=Q(batch_19=True)),

                  not_complete_1=Count('allocated_time', 

                  filter=Q(batch_19=False)),

                  complete_2=Count('allocated_time', 

                     filter=Q(batch_20=True)),

                  not_complete_2=Count('allocated_time', 

                   filter=Q(batch_20=False)),

                  complete_3=Count('allocated_time', 

                   filter=Q(batch_21=True)),

                  not_complete_3=Count('allocated_time', 

                filter=Q(batch_21=False)))

     return my_count


   def get(self, request):

    c_batch_18 = list()

    n_batch_18 = list()

    c_batch_19 = list()

    n_batch_19 = list()

    c_batch_20 = list()

    n_batch_20 = list()

    c_batch_21 = list()

    n_batch_21 = list()


    for entry in self.get_my_count():

        c_batch_18.append(entry['complete'] * entry['allocated_time'])

        n_batch_18.append(entry['not_complete'] * entry['allocated_time'])

        c_batch_19.append(entry['complete_1'] * entry['allocated_time'])

        n_batch_19.append(entry['not_complete_1'] * entry['allocated_time'])

        c_batch_20.append(entry['complete_2'] * entry['allocated_time'])

        n_batch_20.append(entry['not_complete_2'] * entry['allocated_time'])

        c_batch_21.append(entry['complete_3'] * entry['allocated_time'])

        n_batch_21.append(entry['not_complete_3'] * entry['allocated_time'])


    survived_series = [sum(c_batch_18), sum(c_batch_19), sum(c_batch_20), sum(c_batch_21), 0]

    not_survived_series = [sum(n_batch_18), sum(n_batch_19), sum(n_batch_20), sum(n_batch_21), 0]


    return render(request, 'chart.html', {'survived_series': json.dumps(survived_series),

                                          'not_survived_series': json.dumps(not_survived_series)})


class ChartElectrical(ShowChart):

   def get_my_count(self):

      # overriding get_my_count function

      my_count = Electrical.objects.values(...)

      return my_count

可能的优化

另外,这里有一些优化思路:


1.您可以通过注释进行等计算c_batch_18。n_batch_18像这样:


from django.db.models import ExpressionWrapper, IntegerField


mycount = mycount.annotate(c_batch_18=ExpressionWrapper(

            F('complete') * F('allocated_time'), output_field=IntegerField()))

         .annotate(n_batch_18=ExpressionWrapper(

            F('not_complete') * F('allocated_time'), output_field=IntegerField())) # and so on

2.也可以通过聚合计算Sum :


from django.db.models import Sum


my_count_sums = my_count.aggregate(c_batch_18_sum=Sum('c_batch_18'), n_batch_18=Sum('n_batch_18')) # and so on


survived = list(filter(lambda x: x.key().startswith('c_batch'), my_count_sums))


not_survived = list(filter(lambda x: x.key().startswith('n_batch'), my_count_sums))

通过使用这些优化,您将通过 DB 进行最多的计算,而不是依赖 python 资源。


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信