有没有一种方法可以在每个GET请求中为DRF中的新数据重新加载ViewSet?

时间:2019-10-27 21:17:04

标签: django python-3.x django-rest-framework

我正在尝试从我的模型生成一个随机对象。问题在于它只能工作一次,然后我必须重新启动服务器才能获取新对象。只是一直给我相同的对象,直到重新启动。

我一直在寻找堆栈溢出的解决方案,但没有找到任何解决方法。

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

每次使用DailyTaskEcommerceViewSet进行GET请求时,我都希望接收一个新对象(任务)。

提前谢谢! :D

1 个答案:

答案 0 :(得分:1)

您可以通过一种方法来执行此操作。在这种情况下,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)