изменение ответа на каждый запрос GET в django - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь реализовать балансировку нагрузки в Django с использованием метода циклического перебора, получая разные ответы на каждый GET вызов.

Моя модель:

class Load_Balancing(models.Model):
    instance_name = models.CharField(max_length=100)
    sequence = models.IntegerField()
    algorithm = models.CharField(max_length=100)

Я попытался:

class Get_Instance(APIView):

    def get(self, request):
        next_instance = Load_Balancing.objects.all().order_by("last_visited")[:1]  # get the oldest one
        next_instance.save()
        data = {}
        for r in ins:
            data["instance_name"] = r.instance_name
        return Response(data)

Здесь instance_name является случайным URL, и я пытаюсь сделать его динамическим c, чтобы при каждом запросе GET я получал последний экземпляр, а затем другие экземпляры. по порядку т.е. 1-й экземпляр в базе и т. д.

1 Ответ

1 голос
/ 19 апреля 2020

Вместо этого вы можете использовать поле models.DateTimeField(). Запишите последний раз, когда они использовались, затем получите самый старый:

class Load_Balancing(models.Model):
    ...
    last_visited = models.DateTimeField(auto_now=True)
    ...
class Get_Instance(APIView):
    def get(self, request):
        next_instance = Load_Balancing.objects.all().order_by("last_visited").first()  # get the oldest one
        next_instance.save()  # this will update the last_visited field
        ...

Если вы хотите получить все экземпляры:

class Get_Instance(APIView):
    def get(self, request):
        instances = list(Load_Balancing.objects.all().order_by("-last_visited"))
        current_instance = instances[-1]
        current_instance.save()
        data = []
        for instance in instances:
            data.append({
                'instance_name': instance.instance_name,
                'is_current': instance == current_instance
            })
        return Response(data)

Это не обязательно потокобезопасен, но если вам не нужно, этого должно быть достаточно для того, что вы пытаетесь сделать

...