[python] सूची में * हर * आइटम के लिए Django फ़िल्टर क्वेरीसेट __in


1 Answers

एक और दृष्टिकोण जो काम करता है, हालांकि केवल PostgreSQL, django.contrib.postgres.fields.ArrayField का उपयोग कर django.contrib.postgres.fields.ArrayField :

उदाहरण docs से कॉपी किया गया:

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__contains=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__contains=['django'])
<QuerySet [<Post: First post>, <Post: Third post>]>

>>> Post.objects.filter(tags__contains=['django', 'thoughts'])
<QuerySet [<Post: First post>]>

ArrayField में कुछ और शक्तिशाली विशेषताएं हैं जैसे overlap और इंडेक्स ट्रांसफॉर्म

Question

मान लें कि मेरे पास निम्नलिखित मॉडल हैं

class Photo(models.Model):
    tags = models.ManyToManyField(Tag)

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

एक दृश्य में मेरे पास श्रेणियों नामक सक्रिय फ़िल्टर वाली एक सूची है। मैं फोटो ऑब्जेक्ट्स फ़िल्टर करना चाहता हूं जिनमें सभी टैग श्रेणियों में मौजूद हैं।

मैंने कोशिश की:

Photo.objects.filter(tags__name__in=categories)

लेकिन यह श्रेणियों में किसी भी आइटम से मेल खाता है, सभी आइटम नहीं।

तो यदि श्रेणियां ['छुट्टी', 'गर्मी'] होंगी, तो मैं फोटो को छुट्टियों और ग्रीष्मकालीन टैग दोनों के साथ चाहता हूं।

क्या यह हासिल किया जा सकता है?




अगर हम इसे गतिशील रूप से करना चाहते हैं, तो उदाहरण का पालन करें:

tag_ids = [t1.id, t2.id]
qs = Photo.objects.all()

for tag_id in tag_ids:
    qs = qs.filter(tag__id=tag_id)    

print qs



Related