Django ForeignKey值的完全匹配 [英] Django exact match of ForeignKey Values

查看:40
本文介绍了Django ForeignKey值的完全匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

class Sentence(Model):
    name = CharField()

class Tokens(Model):
   token = CharField()
   sentence = ForeignKey(Sentence, related_name='tokens')

  1. 我想实现两种情况:句子正好由三个组成令牌 ['I','like','apples'] .因此, sentence.tokens.all()的列表完全是 ['I','like','apples'] .

  1. I want to implement two cases: Sentence consists exactly of three tokens ['I', 'like', 'apples']. So list of sentence.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆