Django - пишите код на Python элегантным способом

У меня ситуация, как показано ниже:

в models.py:

    class singer(models.Model):
        name = models.CharField()
        nickName = models.CharField()
        numSongs= models.IntegerField()

   class writer(models.Model):
        name = models.CharField()
        numBooks = models.IntegerField()


    class weeklyTimeSinger(models.Model):
        singerID = models.ForeignKey(singer, on_delete = models.CASCADE, related_name = 'hook1')
        dayWeek = models.IntegerField() 
        startHour = models.TimeField()
        stopHour = models.TimeField()
    
    class weeklyTimeWriter(models.Model):
        writerID = models.ForeignKey(writer, on_delete = models.CASCADE, related_name = 'hook2')
        dayWeek = models.IntegerField() 
        startHour = models.TimeField()
        stopHour = models.TimeField()

в view.py:

class Filters(APIView):
    def queryFilter(self, querySet, request, singerOtWriter):
            param1 = int(request.GET.get('param1', 0))
            param2 = int(request.GET.get('param2', 0))

        if singerOtWriter == "singer":
             querySet = querySet.filter(weeklyTimeSinger_dayWeek=param1)
             querySet = querySet.filter(weeklyTimeSinger_startHour__lt=param2) 
             querySet = querySet.update(.....
             ....a lot of operation on querySet
        else if singerOtWriter == "writer":
             querySet = querySet.filter(weeklyTimeWriter_dayWeek=param1)
             querySet = querySet.filter(weeklyTimeWriter_startHour__lt=param2) 
             querySet = querySet.update(.....
             ....a lot of operation on querySet, the same of the case singer

       return querySet 


class Artist(Filters):
    def get(self, request):
        querySetSinger = singer.objects.all().annotate(numWorks= F('numSongs'))
        querySetSinger = self.queryFilter(querySetSinger , request, "singer")
        querySetSinger = querySetSinger.values('name', 'numWorks')

        querySetWriter = writer.objects.all().annotate(numWorks= F('numBooks'))
        querySetWriter = self.queryFilter(querySetWriter , request, "writer")
        querySetWriter = querySetWriter.values('name', 'numWorks')

        values = querySetSinger.union(querySetWriter)
        serialized = ArtistSerializers(values, many = True)
        return Response(serialized.data)
    

В функции queryFilter у меня есть 2 разных потока в зависимости от параметра singerOtWriter. Эти два потока длинные и одинаковые, за исключением имен таблиц "weeklyTimeWriter" или "weeklyTimeSinger", и я не хочу повторять эти строки кода, потому что это выглядит грязно. Я не указал все строки кода, но их много.

Есть ли лучший и более элегантный способ переписать этот код и обобщить эти операции?

Спасибо за все.

сохраните ту же таблицу для певца/писателя и используйте поле типа. Вы также можете легко фильтровать.

models.py будет выглядеть так:-

artistTypes = (
        ('Singer', 'Singer'),
        ('Writer', 'Writer'),
    )

class artistName(models.Model):
      name = models.CharField()
      nickName = models.CharField()
      artistType = models.CharField(max_length=10, choices=artistTypes)
      numReleases = models.IntegerField()

class timeSpent(models.Model):
    artistID = models.ForeignKey(artistName, on_delete = models.CASCADE)
    dayWeek = models.IntegerField() 
    startHour = models.TimeField()
    stopHour = models.TimeField()
Вернуться на верх