第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當每個帖子使用 UUID 而不是順序 ID 時,如何在 Django 中有效地對隨機帖子進行采樣?

當每個帖子使用 UUID 而不是順序 ID 時,如何在 Django 中有效地對隨機帖子進行采樣?

ABOUTYOU 2022-10-25 10:50:00
我有一些 ID 是 UUID 的帖子模型?,F(xiàn)在我想在我的 post_detail 模板中顯示一些用戶可能還希望看到的隨機帖子提案......這就是我處理用戶可能還希望在views.py中看到的帖子提案的方式:def post_proposals():    post_elements = sorted(        chain(            Model1.objects.all(),            Model2.objects.all(),            Model3.objects.all()        )    )    post_elements_list = list(post_elements) # Conversion to list is requierd by random    post_proposals = random.sample(post_elements_list)    return post_proposalsdef post_detail(request, pk):    ...  args = {    'post': post,    'post_proposals': post_proposals(),  ...模板.html: {% for post_proposal in post_proposals %}    <h1>{{ post_proposal.title }}</h1> {% endfor %}現(xiàn)在的問題是,據(jù)我所知,這會破壞我的數(shù)據(jù)庫性能......一旦我的數(shù)據(jù)庫中存儲了很多帖子,查詢就會變得龐大。我首先必須獲取 3 個模型的所有元素,然后每次向用戶顯示帖子時從列表中獲取 10 個隨機條目。我還發(fā)現(xiàn)以下似乎非常有用:https://elpenia.wordpress.com/2010/05/11/getting-random-objects-from-a-queryset-in-django/遺憾的是,我無法使用該解決方案,因為我使用的是非順序字符串的 UUID,而不是使用 ID 時的 int 值。
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻1829條經(jīng)驗 獲得超6個贊

問題是你有不同的模型,這使得操作非常昂貴。我建議您添加一個新模型,其中您要查詢的所有模型都注冊為外鍵或 id/type 對。有了它,您可以繞過設(shè)計缺陷,并且

  1. 僅提取 id:model.objects.all().values_list('id',flat=True)。random.sample 的結(jié)果將是 ids,您可以直接使用 id 拉出帖子

  2. 在新表的 1 和 count() 之間生成一個隨機范圍,然后通過處理具有相應(yīng)索引的記錄來提取實際帖子。這將需要您添加一個索引字段,因為 id 可能不是連續(xù)的(刪除和填充)

獲得 ID 后,您可以使用 model.objects.filter(id__in=post_proposals) 拉取集合并進一步處理

--- 編輯示例實現(xiàn) ---

環(huán)繞其他模型的模型看起來像這樣:

class Model1(models.Model):

   @staticmethod

   def get_ref_type(): return 0


   def create(self):

      super(Model1,self).create()

      Posts.register(self,Model1.get_ref_type())


   def delete(self):

      Posts.un_register(self,Model1.get_ref_type())

      super(Model1,self).delete()


class Posts(models.Model):

  class Meta: 

    ....


  #sequential index, this is what you will filter against

  index    = models.IntegerField(default=0)

  #type of the model you want to query

  ref_type = models.IntegerField(default =-1)

  #id of the record in the table defined in the ref_type field

  ref_id   = models.IntegerField(default =-1)


  @staticmethod

  def register(f_objRecord,f_intType):

      l_objWrp = Posts()

      #a separate table that will be used to hold the free indexes

      #it will ensure that even when you delete records, there

      #won't be any holes in the set

      l_objWrp.index = PostIndex.get_index()

      l_objWrp.ref_id = f_objRecord.id 

      l_objWrp.ref_type = f_intType


      l_objWrp.save()


  @staticmethod

  def un_register(f_objRecord,f_intType):

     l_objWrp = Posts.objects.get(ref_type=f_intType,ref_id=f_objRecord.id)

     PostIndex.free_index(l_objWrp.index)

     l_objWrp.delete()

  def get_data(self):

     l_intRefType = self.ref_type

     l_intId      = self.ref_id


     l_objRecord = None

     if l_intRefType == Model1.get_ref_type():

        l_objRecord = Model1.objects.get(id=l_intId)

     elif l_intRefType == Model2.get_ref_type():

       .....


     if l_objRecord: 

        #pull the data you want

     else: raise('unknown model type')


查看完整回答
反對 回復(fù) 2022-10-25
?
米琪卡哇伊

TA貢獻1998條經(jīng)驗 獲得超6個贊

例如,您可以嘗試讓數(shù)據(jù)庫隨機排序然后切片

Model1.objects.order_by('?')[:3]`.

文檔警告說,這order_by可能既昂貴又緩慢,但可能值得測試,看看它在實踐中是否給出了可接受的結(jié)果。


查看完整回答
反對 回復(fù) 2022-10-25
  • 2 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號