簡體   English   中英

如何在沒有for循環的情況下注釋/匯總列表中的每個項目(Django)

[英]How to annotate/aggregate each item in a list without for loops (Django)

我有一個列表s,該列表是從Label類中的modelfield“句子”保存並過濾的,其中一個modelfield“ label”包含list s中的每個項目,即句子s中每個項目的每個項目一個帖子。 我想匯總或標注字段句子列表s中“標簽”中的項,最大出現第三個字段“ labelnames”。 例如,字段句子中的list; [“ a”,“ green”,“ car”]。 對於類s中s中的每個元素,都會發生; 例如,“ a”計算所有在“ labelnames”中帶有句子和字段的帖子中出現“ a”的最大次數。 我想知道是否有更好的方法聚合而不是循環list中的元素,然后用“ labelname”和“ label”注釋或聚合它們?

對於S中的每個元素,“ a”,“ green”,“ car”,僅當其中一個元素在帶有S的帖子中(它們保存在Label()類中)時,字段pos和列表中的一個“ a”字段句子中的s,字段標簽中的第二個“綠色”和句子中的列表s等等),使用字段標簽名中的元素聚合或注釋元素,例如,如果標簽名A或B取決於標簽最大值,則使用標簽名A的元素“ a”具有標簽名字段值“ A”的所有元素“ a”的計數的最大值大於保存在數據庫中的所有具有標簽名字段值“ B”的標簽“ a”的值。

#I've retrived id for sentence s by for label "a"
str_ = "a"
t = Label.objects.filter(label__startswith=str_).filter('label')
# get sentence that t is associated with
s =  OneLabelingPCS.objects.get(pk=int(t.id)).sentence  
            #print

#這給了我pk = int(t.id)一個帖子“ a”和句子出現的位置。我希望所有帖子“ a”,“ green”,“ a car”都帶有句子s和最大標簽名。 #在models.py中

class Label(models.Model):


 sentence = models.CharField(max_length=200) # <-- contains list s
  label = models.CharField(max_length=200) # <-- contains each item in s, one item per post 
labelname = models.CharField(max_length=200) 

就Django而言,“句子”是一個字符串..它也作為字符串存儲在數據庫中..因此Django和數據庫都不了解您放置在其中的列表的元素。

這樣做的傳統方式是擁有包含所有單詞的第二個表,例如:

class Label(models.Model):
    label = models.CharField(max_length=200) 
    labelname = models.CharField(max_length=200)

class LabelWord(models.Model):
    word = models.CharField(max_length=30)
    position = models.IntegerField()
    label = models.ForeignKey(Label)

因此,對於您插入的每個標簽,還要插入LabelWord記錄,例如:

label = Label(label="fooo", labelname="FOO Name")
label.save()

position = 0
for word in ('a', 'green', 'car'):
    LabelWord(label=label, word=word, position=position).save()
    position += 1

好的,現在您想查找所有帶有“汽車”一詞的標簽嗎? Django並未明確說明如何執行此操作..但這是簡單(但不是超級高效)的方法:

labels = Label.objects.filter(
    pk__in=LabelWords.objects.filter(word='car').values_list('label_id', flat=True)
)

對於相對少量的數據,這將很好地工作。 搜索“反向外鍵上的django過濾器” ..您會發現人們試圖更有效地解決django的普遍問題。

我要補充的另一件事是,您可以使用ManyToMany關系執行此操作,因此每個唯一的單詞僅存儲一次。 在某些方面更有效率,而在其他方面則效率較低...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM