2016-05-10 9 views
1

私は3つのモデルを持っています。 Query,QueryStringTagおよびTag。これらのモデルは、私が構築したタグクラウドの一部です。 Queryは、多くはTagsであり、Tagは、多くてQuerysを有することができる。 TagQueryモデルには、クエリがタグとどのように関連付けられているかについてのすべての情報を保持する接続QueryStringTagモデルへの外部キーがあります。多くのORMオブジェクトで複数のタグによるDjangoフィルタリング

ここでは私のモデルは、私は現在、それはユーザーがタグクラウド内のタグの任意の金額をクリックすると、タグの主キーの配列が送信される設定している...

class Tag(models.Model): 
    name = models.CharField(max_length=101) 
    use_count = models.IntegerField(default=1) 

class QueryStringTag(models.Model): 
    tag = models.ForeignKey(Tag, related_name='qstag') 
    querystring = models.ForeignKey(QueryString, related_name='qsquerystring') 

class QueryString(BaseObject): 
    """ 
    Query string holds an SQL statement and query properties for execution 
    """ 

    server_id = models.IntegerField() 
    schema = models.CharField(max_length=255, blank=True) 
    archived = models.BooleanField(default=False) 
    query = models.CharField(max_length=60000) 
    variables = models.TextField(blank=True) 
    created_by = models.ForeignKey(User, related_name='queries_created') 
    updated_by = models.ForeignKey(User, related_name='queries_last_edited') 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField() 
    touched_by = models.CharField(max_length=1000) 
    config = models.TextField(blank=True) 
    runs_started = models.IntegerField(default=0) 
    runs_completed = models.IntegerField(default=0) 
    runs_completed_duration = models.IntegerField(default=0) # total number of seconds spent running this query to completion 
    formats = "pretty_html html json prettyjson csv excel tableau".split() 

です私のdjangoビューには次のようなものがあります:['12', '14', '15']

ユーザーがクリックしたすべてのタグに関連付けられたすべてのクエリを取得するには、Django ORMを使用する必要があります。したがって、ユーザーがタグ、 'user'、 'game'、 'truck'をクリックすると、ユーザーがクリックしたすべてのタグに関連付けられたクエリのみが表示されます。これはANDの関係であり、ORの関係ではありません。意味「Query1」は「12」、「14」、「15」に関連付けられます。

これに対して正しい構文は何でしょうか?

+0

あなたは 'QuerySting'で' ManyToManyField'として 'Tag'を持っている場合は、これを実装するために容易になるだろう。 'QueryStringTag'を持つ目的は何ですか? –

+0

@ShangWangそれは私たちのローカル開発環境が 'ManyToManyField'を受け入れないことです。私はこのようにしなければならなかった。 –

+0

私はこれを 'ManyToManyField'とだけ行いました。それに関連した答えはたくさんあります:http://stackoverflow.com/questions/13270513/django-manytomany-filter-matching-on-all-items-in-a -listおよびhttp://stackoverflow.com/questions/8618068/django-filter-queryset-in-for-every-item-in-listたぶんraw SQLが役に立ちます。 –

答えて

1
qsts_pks = QueryStringTag.objects.filter(tag__pk__in=['12', '14', '15']).values_list('id', flat=True) 
queries = QueryString.objects.filter(qsquerystring__pk__in=qsts_pks) 

関連ドキュメントherehere

関連する問題