我需要快速查找我在Django中编写的Web应用程序的单词。我想把这个单词的每个字符放在一个自己的整数字段中,按位置索引。
class Word(models.Model):
word = models.CharField(max_length=5)
length = models.IntegerField()
c0 = models.IntegerField(blank=True, null=True)
c1 = models.IntegerField(blank=True, null=True)
c2 = models.IntegerField(blank=True, null=True)
c3 = models.IntegerField(blank=True, null=True)
c4 = models.IntegerField(blank=True, null=True)
mapping = [c0, c1, c2, c3, c4,]
def save(self):
self.length = len(self.word)
for (idx, char) in enumerate(self.word):
self.mapping[idx] = ord(char)
models.Model.save(self)
然后我可以像Word.objects.filter(length=4, mapping[2]=ord('A'))
这样的查询来查找长度为4的所有在第三个位置都有A的单词。
我不太确定设计和一些机制,所以我想在我去尝试实现之前我会在这里寻求建议。我不完全确定查询的语法。
所以,我想问题是
mapping[2]
会工作吗?谢谢!
答案 0 :(得分:0)
映射[2]会起作用吗?
不,它不会。
我是否可以将字典传递给过滤器命令,以便我可以拥有可变数量的关键字参数?
当然可以。例如:
conditions = dict(word__startswith = 'A', length = 5)
Word.objects.filter(**conditions)
会找到以Word
开头的所有A
个实例,并且长度为五个字符。
您对设计有什么建议吗?
这对我来说就像一个过早优化的情况。我怀疑对于中等数量的数据,你应该能够将合适的数据库函数与Django的过滤器结合起来,以获得你需要的东西。
例如:
找到长度为4的所有单词,其中A位于第三位。
您可以将Django过滤器与(Postgresql)strpos
结合使用。
contains, position = 'A', 3
where = ["strpos(word, '%s') = %s" % (contains, position)]
Word.objects.filter(length = 4, word__contains = contains).extra(where = where)