python - 如何在不使用 for 循环的情况下注释/聚合列表中的每个项目 (Django)

标签 python django django-models annotations aggregate-functions

我有一个列表 s,它是从类 Label 中的模型字段“句子”中保存和过滤的,模型字段“标签”包含列表 s 中的每个项目,即句子 s 中的每个项目的每个项目一个帖子。我想聚合或注释字段句子中列表中“标签”中的项目以及第三个字段“标签名称”的最大出现次数。例如,在字段句中列出 s; [“a”、“绿色”、“汽车”]。对于类 s 中 s 中的每个元素,都会出现;以“a”为例,计算“a”在所有句子和字段在“labelnames”中的帖子中的最大出现次数。我想知道是否有更好的方法来聚合它,而不是循环列表中的元素,然后用“labelname”和“label”注释或聚合它们?

对于 S 中的每个元素,“a”、“green”、“car”,仅当其中一个元素位于带有 S 的帖子中时(它们保存在类 Label () 字段中的一个 pos“a” 中)字段句子中的标签和列表,字段标签中的第二个帖子“绿色”和句子中的列表等),使用字段标签名称中的元素聚合或注释元素,例如如果标签名称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”和句子的帖子。我 #like 所有带有句子 s 的帖子“a”、“green”、“a car”和最大标签名称。 # 在 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

好的,现在您想查找所有带有“car”一词的标签吗? Django 并没有明确说明如何做到这一点..但这是简单(但不是 super 有效)的方法:

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

这对于相对少量的数据来说效果很好。搜索“反向外键上的 django 过滤器”..您会发现这是 django 的一个常见问题,人们正在尝试更有效地解决它。

我要补充的另一件事是,您可以使用多对多关系来执行此操作,从而仅将每个唯一单词存储一次。在某些方面效率更高,在其他方面效率较低......

关于python - 如何在不使用 for 循环的情况下注释/聚合列表中的每个项目 (Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423550/

相关文章:

python - 从 fastapi 响应中删除默认的 `application/json` header

django - 如何向所有 Django 响应添加 HTTP header

django - 在 Django 中从 direct_to_template 移动到新的 TemplateView

查询集交集的Django过滤器?

python - 如何使用 `` xlrd.xldate_as_tuple( )``

python - 检查Python中的输入和输出文件是否相同

python - Django 使用 .extra() 仅查询模型的一个字段,而不使用 .defer() 或 .only()

python - 如何在 Django 模型中存储复数

python - 避免多次调用 Mixin 类的 __init__

python - django 和 mod_wsgi 有数据库连接问题