Есть ли способ перезагрузить ViewSet при каждом запросе GET для новых данных в DRF? - PullRequest
0 голосов
/ 28 октября 2019

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

Я искал решение по переполнению стека, но не нашел ни одного.

Views.py

def dailyaskist(category):
    qs = Task.objects.filter(category=category)
    max_num = len(qs)
    while True:
        pk = random.randint(1, max_num)
        task = Task.objects.filter(pk=pk).first()
        if task:
            return task.pk


class DailyTaskEcommerceViewSet(viewsets.ModelViewSet):
    category = 'ecommerce'
    task_pk = dailyaskist(category)
    queryset = Task.objects.filter(pk=task_pk)
    serializer_class = TaskSerializer

serialisers.py

class StepSerializer(serializers.HyperlinkedModelSerializer):
    task_id = serializers.PrimaryKeyRelatedField(queryset=Task.objects.all(), source='task.id')

    class Meta:
        model = Step
        fields = ('title', 'description', 'done', 'task_id')


class TaskSerializer(serializers.HyperlinkedModelSerializer):
    steps = StepSerializer(many=True, read_only=True)

    class Meta:
        model = Task
        fields = ('title', 'description', 'video', 'done', 'steps')

models.py

Categories = (
    ('ecommerce', 'Ecommerce'),
)


class Task(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField(max_length=360)
    video = models.CharField(max_length=30, default='')
    category = models.CharField(choices=Categories, default='', max_length=30)
    done = models.BooleanField(default=False)

    def __str__(self):
        return self.title


class Step(models.Model):
    task = models.ForeignKey(Task, related_name='steps', on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    description = models.TextField(max_length=360)
    done = models.BooleanField(default=False)

    def __str__(self):
        return self.title

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

Заранее спасибо! : D

1 Ответ

1 голос
/ 28 октября 2019

Вы бы сделали это методом. В этом случае get_queryset кажется правильным местом.

class DailyTaskEcommerceViewSet(viewsets.ModelViewSet):
    serializer_class = TaskSerializer
    category = 'ecommerce'

    def get_queryset(self):
        task_pk = dailyaskist(self.category)
        return Task.objects.filter(pk=task_pk)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...