首页 > 解决方案 > 有没有办法在 DRF 中对新数据的每个 GET 请求重新加载 ViewSet?

问题描述

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

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

视图.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

序列化程序.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')

模型.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

标签: djangopython-3.xdjango-rest-framework

解决方案


你会在一个方法中做到这一点。在这种情况下,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)

推荐阅读