Python DRF以随机顺序获取对象列表

Python DRF以随机顺序获取对象列表,python,django,django-rest-framework,Python,Django,Django Rest Framework,我将随机获取对象,但它会再次显示一个元素。它应该随机返回所有元素,不重复。实际上,我使用的代码是重复的,我有分页功能,因为如果用户单击ShowMore按钮,它会再次显示一个对象 class ModelModel(mdoels.Model): field_1 = mdoels.CharField(max_length=125) field_2 = models.ForeignKey(SomeModel) user = models.ForeignKey(User) class

我将随机获取对象,但它会再次显示一个元素。它应该随机返回所有元素,不重复。实际上,我使用的代码是重复的,我有分页功能,因为如果用户单击ShowMore按钮,它会再次显示一个对象

class ModelModel(mdoels.Model):
   field_1 = mdoels.CharField(max_length=125)
   field_2 = models.ForeignKey(SomeModel)
   user = models.ForeignKey(User)

class ListObjectView(generics.ListAPIView):
    queryset = Model.objects.all().order_by('-pk').order_by('?')
    serializer_class = ExampleSerializer
我还编写了一个自定义函数,它可以随机获取数据,但它只返回一个对象,而不是所有对象

def get_random_objects():
    return random.randrange(1, Model.objects.all().count() + 1)

class ItemsListView(generics.ListAPIView):
    #queryset = Model.objects.all()
    serializer_class = ExampleSerializer

    def get_queryset(self):
        return Model.objects.all().filter(id=get_random_objects())
它只返回一个模型对象,而不是所有对象。如何返回随机排序的所有元素

[<Model: Object_1>, <Model: Object_2>]
Internal Server Error: /product-list/
Traceback (most recent call last):
  File "/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "venv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "venv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "venv/lib/python3.7/site-packages/rest_framework/views.py", line 497, in dispatch
    response = self.handle_exception(exc)
  File "venv/lib/python3.7/site-packages/rest_framework/views.py", line 457, in handle_exception
    self.raise_uncaught_exception(exc)
  File "venv/lib/python3.7/site-packages/rest_framework/views.py", line 468, in raise_uncaught_exception
    raise exc
  File "venv/lib/python3.7/site-packages/rest_framework/views.py", line 494, in dispatch
    response = handler(request, *args, **kwargs)
  File "venv/lib/python3.7/site-packages/rest_framework/generics.py", line 199, in get
    return self.list(request, *args, **kwargs)
  File "venv/lib/python3.7/site-packages/rest_framework/mixins.py", line 38, in list
    queryset = self.filter_queryset(self.get_queryset())
  File "venv/lib/python3.7/site-packages/rest_framework/generics.py", line 150, in filter_queryset
    queryset = backend().filter_queryset(self.request, queryset, self)
  File "/venv/lib/python3.7/site-packages/django_filters/rest_framework/backends.py", line 90, in filter_queryset
    filterset = self.get_filterset(request, queryset, view)
  File "/venv/lib/python3.7/site-packages/django_filters/rest_framework/backends.py", line 31, in get_filterset
    filterset_class = self.get_filterset_class(view, queryset)
  File "venv/lib/python3.7/site-packages/django_filters/rest_framework/backends.py", line 64, in get_filterset_class
    assert issubclass(queryset.model, filterset_model), \
AttributeError: 'list' object has no attribute 'model'
[,]
内部服务器错误:/product list/
回溯(最近一次呼叫最后一次):
文件“/venv/lib/python3.7/site packages/django/core/handlers/exception.py”,第34行,在内部
响应=获取响应(请求)
文件“venv/lib/python3.7/site packages/django/core/handlers/base.py”,第115行,在“get”响应中
response=self.process\u异常\u由\u中间件(e,请求)
文件“venv/lib/python3.7/site packages/django/core/handlers/base.py”,第113行,在“获取”响应中
响应=包装的回调(请求,*回调参数,**回调参数)
文件“venv/lib/python3.7/site packages/django/views/decorators/csrf.py”,第54行,在包装视图中
返回视图函数(*args,**kwargs)
文件“venv/lib/python3.7/site packages/django/views/generic/base.py”,第71行,在视图中
返回自调度(请求,*args,**kwargs)
文件“venv/lib/python3.7/site packages/rest_framework/views.py”,第497行,已发送
响应=自身处理异常(exc)
文件“venv/lib/python3.7/site packages/rest\u framework/views.py”,第457行,在handle\u异常中
自举未捕获异常(exc)
文件“venv/lib/python3.7/site packages/rest\u framework/views.py”,第468行,在raise\u uncaught\u异常中
加薪
文件“venv/lib/python3.7/site packages/rest_framework/views.py”,第494行,已发送
响应=处理程序(请求、*args、**kwargs)
文件“venv/lib/python3.7/site packages/rest_framework/generics.py”,第199行,在get中
返回self.list(请求、*args、**kwargs)
文件“venv/lib/python3.7/site packages/rest_framework/mixins.py”,列表第38行
queryset=self.filter\u queryset(self.get\u queryset())
文件“venv/lib/python3.7/site packages/rest\u framework/generics.py”,第150行,在filter\u queryset中
queryset=backend().filter\u queryset(self.request,queryset,self)
文件“/venv/lib/python3.7/site packages/django_filters/rest_framework/backends.py”,filter_queryset中的第90行
filterset=self.get\u filterset(请求、查询集、视图)
文件“/venv/lib/python3.7/site packages/django_filters/rest_framework/backends.py”,第31行,在get_filterset中
filterset\u class=self.get\u filterset\u class(视图,查询集)
文件“venv/lib/python3.7/site packages/django_filters/rest_framework/backends.py”,第64行,在get_filterset_类中
断言issubclass(queryset.model、filterset_model)\
AttributeError:“列表”对象没有属性“模型”

有什么帮助吗?提前谢谢你

以下类似的方法应该可以工作,它在会话中存储一个种子,这样用户每次都可以获得相同的随机对象列表

class ItemsListView(generics.ListAPIView):
    serializer_class = ExampleSerializer
    filter_backends = []

    def get_queryset(self):
        objects = list(Model.objects.all())
        seed = self.request.session.setdefault('seed', random.randint(1, 1000))
        random.seed(seed)
        result = random.sample(objects, len(objects))
        random.seed()  # Just for good measure
        return result

我实现类似目标的方法是注释任意字段的散列

实际代码如下所示

注意:Postgres上的
SHA1
(或其他哈希算法)函数需要扩展
pgcrypto

从django.db.models导入值
从django.db.models.functions导入SHA1,Concat
类示例示例ModelViewSet(viewsets.ModelViewSet):
"""
示例模型视图集
"""
serializer\u class=ExampleModelSerializer
排序_字段=[“随机”,“id”]
def get_queryset(自我):
qs=ExampleModel.objects.all()
如果(
self.request.query_参数中的“排序”
和self.request.query_参数[“ordering”]=“random”
):
random_seed=self.request.query_params.get(“random_seed”,”)
qs=qs.annotate(
随机=SHA1(
Concat(“名称”,值(随机种子)),
)
).订购人(“随机”)
返回qs

您的筛选器是
id=…
所以您正在尝试获取一个特定的id.
random.randrange
将只返回1个值
Model.objects.all().order\u by('?')
应以随机顺序返回所有对象是否有任何方法返回所有对象?@Nerd您为什么希望结果随机化?您可以缓存一个种子值,并使用它为我使用的每个用户以一致的顺序随机化对象列表
sample
,在我给出这个问题之前,它抛出了这个错误
人口必须是一个序列或集合。对于DICT,使用列表(d).
我使用了你的答案,但它给出了相同的错误尝试先转换到列表-更新了我转换的答案,但我有一个新错误
'list'对象没有属性“model”
并尝试自定义你的答案,但仍然不起作用此解决方案与
django_过滤器
后端不兼容,如果您不介意将筛选器_后端设置为空列表,则必须将其设置在此APIOPS上筛选器_后端对于此api非常重要,如果没有我无法上载到生产环境,很遗憾,我必须找到另一种方法