Django ForeignKey值的完全匹配 [英] Django exact match of ForeignKey Values
问题描述
class Sentence(Model):
name = CharField()
class Tokens(Model):
token = CharField()
sentence = ForeignKey(Sentence, related_name='tokens')
-
我想实现两种情况:句子正好由三个组成令牌
['I','like','apples']
.因此,sentence.tokens.all()
的列表完全是['I','like','apples']
.
I want to implement two cases: Sentence consists exactly of three tokens
['I', 'like', 'apples']
. So list ofsentence.tokens.all()
is exactly['I', 'like', 'apples']
.
与上述相同,但包含标记(句子的一部分).
Same as above, but contains tokens (part of sentence).
Sentence.objects.annotate(n = Count('tokens,distinct = True)).filter(n = 3).filter(tokens__name ='I').filter(tokens__name ='like').filter(tokens__name ='apples')
不起作用,因为它也匹配 III
.
Sentence.objects.annotate(n=Count('tokens',distinct=True)).filter(n=3).filter(tokens__name='I').filter(tokens__name='like').filter(tokens__name='apples')
doesn't work, since it matches I I I
as well.
有什么方法可以过滤ForeignKey中的确切值集?
Is there any way to filter on exact set of values in ForeignKey?
推荐答案
嗯,我现在更好地理解了这个问题.仅利用您和Jay代码的元素,以下可能是一种方法.可能不是很优雅.但似乎可行.
Ah, I understand the question better now. Just leveraging elements of your and Jay's code, the following might be one approach. May be not very elegant. But seems to work.
def get_sentences(my_tokens):
counts = dict()
for t in my_tokens:
counts[t] = my_tokens.count(t)
results = Sentence.objects
for k, v in counts.iteritems():
results = results.filter(tokens__token=k).annotate(n=Count('tokens',distinct=True)).filter(n__gte=v)
return results
>>> from django.db.models import Count
>>> from my.models import Sentence, Tokens
>>> s1 = Sentence.objects.create(name="S1")
>>> t10 = Tokens.objects.create(token="I", sentence=s1)
>>> t20 = Tokens.objects.create(token="like", sentence=s1)
>>> t30 = Tokens.objects.create(token="apples", sentence=s1)
>>> s2 = Sentence.objects.create(name="S2")
>>> t11 = Tokens.objects.create(token="I", sentence=s2)
>>> t21 = Tokens.objects.create(token="like", sentence=s2)
>>> t31 = Tokens.objects.create(token="oranges", sentence=s2)
>>> s3 = Sentence.objects.create(name="S3")
>>> t31 = Tokens.objects.create(token="I", sentence=s3)
>>> t32 = Tokens.objects.create(token="I", sentence=s3)
>>> t33 = Tokens.objects.create(token="I", sentence=s3)
>>> my_toks = ("I", "like", "apples")
>>> sentences = get_sentences(my_toks)
>>> sentences[0].name
u'S1'
>>> my_toks = ("I", "I", "I")
>>> sentences = get_sentences(my_toks)
>>> sentences[0].name
u'S3'
为准确参考,我的模型如下:
For exact reference, my models look like this:
class Sentence(Model):
name = models.CharField(max_length=16)
class Tokens(Model):
token = models.CharField(max_length=16)
sentence = models.ForeignKey(Sentence, related_name='tokens')
这篇关于Django ForeignKey值的完全匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!