Câu trả lời của Jason Hall và the one here không phải là khủng khiếp, nhưng như ông đề cập, chúng cũng không thực sự ngẫu nhiên. Thậm chí làm mười truy vấn sẽ không được ngẫu nhiên nếu, ví dụ, các số ngẫu nhiên tất cả được nhóm lại với nhau. Để giữ cho mọi thứ thực sự ngẫu nhiên, đây là hai giải pháp khả thi:
Giải pháp 1
Gán một chỉ số cho từng đối tượng kho dữ liệu, theo dõi các chỉ số tối đa, và ngẫu nhiên chọn một chỉ số mỗi khi bạn muốn để có được một kỷ lục ngẫu nhiên:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Upside: Quả thật ngẫu nhiên. Nhanh.
Phía dưới: Bạn phải duy trì đúng các chỉ mục khi thêm và xóa đối tượng, điều này có thể làm cho cả hai thao tác hoạt động O (N).
Giải pháp 2
Gán một số ngẫu nhiên cho mỗi số kho dữ liệu khi nó được tạo ra. Sau đó, để có được một bản ghi ngẫu nhiên lần đầu tiên, truy vấn cho một bản ghi với số ngẫu nhiên lớn hơn một số số ngẫu nhiên và thứ tự khác theo các số ngẫu nhiên (ví dụ: MyObject.order('rand_num').filter('rand_num >=', random.random())
). Sau đó lưu truy vấn đó dưới dạng con trỏ trong memcache. Để có được một bản ghi ngẫu nhiên sau lần đầu tiên, hãy tải con trỏ từ memcache và chuyển đến mục tiếp theo. Nếu không có mục nào sau lần đầu tiên, hãy chạy lại truy vấn.
Để ngăn chuỗi các đối tượng lặp lại, trên mỗi kho dữ liệu đọc, hãy cho thực thể bạn vừa đọc một số ngẫu nhiên mới và lưu nó trở lại kho dữ liệu.
Phía trên: Thật ngẫu nhiên. Không có chỉ số phức tạp nào để duy trì.
Phía dưới: Cần theo dõi con trỏ. Cần phải làm một đặt mỗi khi bạn nhận được một hồ sơ ngẫu nhiên.
có thể trùng lặp của [Truy vấn cho N bản ghi ngẫu nhiên trên kho dữ liệu Appengine] (http://stackoverflow.com/questions/1105004/querying-for-n-random-records-on-appengine-datastore) –