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

在我的 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'])

  

繁星淼淼
浏览 114回答 1
1回答

MMTTMM

我认为您应该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, IntegerFieldmycount = 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 on2.也可以通过聚合计算Sum :from django.db.models import Summy_count_sums = my_count.aggregate(c_batch_18_sum=Sum('c_batch_18'), n_batch_18=Sum('n_batch_18')) # and so onsurvived = 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 资源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python