11

興味深い問題があります。

私は3つのオブジェクトを持っています。すべて同じ

class Articles(models.Model):
    owner = models.ForeignKey(Author)
    tags = models.ManyToManyField('Tag')


class Tag(models.Model):
     name = models.CharField(max_length=255)

だから私は3つの記事を持っています。すべて同じタグ: 'tag1' と 'tag2'

そして、私は質問があります

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") | Q(tags__name__exact="tag2"))).distinct()

これにより、すべての記事が表示されます。両方のタグがあるため、各記事を 2 回収集するため、distinct() なしで 6 つの記事を返します。

ただし、このクエリでは:

actionsAll = Articles.objects.filter((Q(tags__name__exact="tag1") & Q(tags__name__exact="tag2"))).distinct()

これは私に記事を与えません。記事には両方のタグが含まれているため、それらすべてを返す必要がありますか?

4

2 に答える 2

1
** import Q from django
from *models import SuperUser, NameUser
import operator

# we do not know the name in the superhero
super_users = SuperUser.objects.all()
q_expressions = [Q(username=user.username) for user in super_users]
# we have bind super_hero with user
name_superheroes_qs = models.NameUser.objects.filter(reduce(operator.or_, q_expressions))
于 2016-05-06T14:28:57.687 に答える
1

生成された SQL を見ると、同じタグに両方の名前があるかどうかをチェックしていることがわかります。必要なのは、INクエリまたはEXISTSリレーションをトラバースするクエリです。

于 2010-12-24T01:18:15.590 に答える