如何在没有for循环的情况下注释/聚合列表中的每个项(Django)

2024-06-28 20:36:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,s,它是从class Label中的modelfield“sentence”中保存和筛选出来的,一个包含列表s中每个项目的modelfield“Label”,即句子s中每个项目的一个post。我想聚合或注释“Label”中的项目,这些项目在field语句的列表s中最多出现第三个字段“labelnames”。例如,在字段语句中列出s;[“a”,“green”,“car”]。对于类s中的每一个元素,都会出现“a”,例如,计算所有带有“labelnames”中句子和字段的帖子中“a”的最大出现次数。我想知道是否有更好的方法来聚合这些元素,而不是在列表s中循环元素,然后用“labelname”和“label”对它们进行注释或聚合?在

对于S中的每个元素,“a”,“green”,“car”,只有其中一个元素在一个带有S的post中(它们保存在class Label()字段标签中的pos“a”,字段语句中的list S,第二个post“green”保存在field labelname中,以此类推),用field labelname中的元素聚合或注释元素,例如,如果labelname a或B取决于labelname fieldvalue为“a”的所有元素“a”的最大计数,则标签名为a的“a”的最大值比数据库中保存的所有标签“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和最大标签名。 #在模型.py在

^{pr2}$

Tags: 项目元素field列表green标签语句car
1条回答
网友
1楼 · 发布于 2024-06-28 20:36:26

就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记录,例如:

^{pr2}$

好的,现在你想找到所有的标签上都有“车”这个词吗?Django不清楚该怎么做。。但这里有一个简单(但不是超高效)的方法:

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

对于相对较小的数据量来说,这样做很好。搜索“django filter on reverse foreign key”(反向外键上的django过滤器)。。你会发现django的一个常见问题是人们试图更有效地解决它。在

因此,我只能用另一个词来存储一个词。在某些方面效率更高,在其他方面效率更低。。。在

相关问题 更多 >