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()