Query filter by reverse relationship

5 views
Skip to first unread message

Antonis Christofides

unread,
Feb 1, 2011, 8:45:02 AM2/1/11
to djan...@googlegroups.com
Από το documentation του Django (Making queries):

This example retrieves all Blog objects which have at least one
Entry whose headline contains 'Lennon':

>>> Blog.objects.filter(entry__headline__contains='Lennon')

Εγώ όμως θέλω να μου φέρει όλα τα blog objects που έχουν τουλάχιστον
μια entry η οποία:
* να περιέχει Lennon στο headline, και
* να είναι γραμμένη από τον glezos.

Νομίζω πως το παρακάτω:

Blog.objects.filter(entry__headline__contains='Lennon',
entry__authors__name='glezos')

θα μου φέρει όλα τα blog objects που έχουν:
* τουλάχιστον μια entry με Lennon στο headline, και
* τουλάχιστον μια entry γραμμένη από glezos.

Κάνω λάθος; Πώς θα κάνω αυτό που θέλω;

gspanos

unread,
Feb 1, 2011, 8:50:46 AM2/1/11
to djan...@googlegroups.com
>>Blog.objects.filter(entry__authors__name='glezos').filter(entry__headline__contains='Lennon')

Αυτό θες αν κατάλαβα?

2011/2/1 Antonis Christofides <ant...@itia.ntua.gr>
Κάνω λάθος; Πώς θα κάνω αυτό που θέλω;

--
Λάβατε αυτό το μήνυμα επειδή έχετε εγγραφεί στην ομάδα django-gr των Ομάδων Google.

Για να αναρτήσετε κάτι σε αυτήν την ομάδα, αποστείλετε μήνυμα ηλεκτρονικού ταχυδρομείου στη διεύθυνση djan...@googlegroups.com.
Για να καταργήσετε την εγγραφή σας από αυτήν την ομάδα, στείλτε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη διεύθυνση django-gr+...@googlegroups.com.
Για περισσότερες επιλογές, επισκεφθείτε αυτήν την ομάδα στη διεύθυνση http://groups.google.com/group/django-gr?hl=el.


Antonis Christofides

unread,
Feb 1, 2011, 9:01:27 AM2/1/11
to djan...@googlegroups.com
On 2011-02-01 15:50, gspanos wrote:
>
>>Blog.objects.filter(entry__authors__name='glezos').filter(entry__headline__contains='Lennon')
>
> οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½?

οΏ½οΏ½οΏ½, ..., οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½. οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½. οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½
οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½, οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½
οΏ½οΏ½ οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½.

οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½ blog objects οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ glezos οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½
Lennon οΏ½οΏ½οΏ½ headline, οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ gspanos οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½
McCartney οΏ½οΏ½οΏ½ headline. οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½:

Blog.objects.filter( (Q(entry__authors__name='glezos') &
Q(entry__headline__contains='Lennon')) |
(Q(entry__authors__name='gspanos') &
Q(entry__headline__contains='McCartney')))

gspanos

unread,
Feb 1, 2011, 9:07:52 AM2/1/11
to djan...@googlegroups.com
Αφού γνωρίζεις για το Q object είσαι σε καλό δρόμο, αλλά έχω την εντύπωση
πως τα &,| operators πρέπει να τα χρησιμοποιήσεις ανάμεσα στα querysets και
όχι σαν parameter. Δες και πράξε αναλόγως.

Παρεπιπτόντως αυτό που έγραψες πριν 
>>Blog.objects.filter(entry__headline__contains='Lennon', entry__authors__name='glezos') 
πρέπει να λειτουργεί οπως το θες δίοτι υπονοεί AND και όχι OR situation και άρα είναι 
το ίδιο με την απάντηση που σου έδωσα πριν.

2011/2/1 Antonis Christofides <ant...@itia.ntua.gr>
On 2011-02-01 15:50, gspanos wrote:

>>Blog.objects.filter(entry__authors__name='glezos').filter(entry__headline__contains='Lennon')

 Αυτό θες αν κατάλαβα?

Εχμ, ..., νομίζω πως όντως αυτό δουλεύει. Ηλιθιωδώς απλό. Βέβαια το
πρόβλημά μου είναι πιο σύνθετο, αλλά νομίζω πως τώρα καταλαβαίνω πώς
να το λύσω.

Θέλω όλα τα blog objects που είτε είναι γραμμένα από glezos και έχουν
Lennon στο headline, είτε είναι γραμμένα από gspanos και έχουν
McCartney στο headline. Φαντάζομαι πως η απάντηση είναι:


Blog.objects.filter( (Q(entry__authors__name='glezos') &
                     Q(entry__headline__contains='Lennon')) |
                    (Q(entry__authors__name='gspanos') &
                     Q(entry__headline__contains='McCartney')))

gspanos

unread,
Feb 1, 2011, 9:12:00 AM2/1/11
to djan...@googlegroups.com
Γράψε λάθος για τα &,| operators. Είχα καιρό να δω το documentation.
Το είδα τώρα. :D

2011/2/1 gspanos <spanos...@gmail.com>
Reply all
Reply to author
Forward
0 new messages