Django

2013-01-07 9 views
7

में क्वेरीसमूहों विलय मैं models.py में है:Django

class Game(models.Model): 
    players1 = models.ManyToManyField(Player, related_name='games1') 
    players2 = models.ManyToManyField(Player, related_name='games2') 

    def get_all_players(self): 
     return list(itertools.chain(self.players1.all(), self.players2.all())) 

मैं एक ही get_all_players विधि कैसे लिख सकते हैं, लेकिन QuerySet, नहीं list वापसी?

पीएस मुझे पता है कि वहाँ है ऑपरेटर:

def get_all_players(self): 
    return self.players1.all() | self.players2.all() 

लेकिन यह एक बहुत अजीब तरीके से काम करता है।

# On the top of the file: 
from django.db.models import Q 

# Game instance method: 
def get_all_players(self): 
    return Player.objects.filter(Q(games1__pk=self.pk) | Q(games2__pk=self.pk)) 

Q यहाँ विवरण में वर्णित है:: इस समारोह का परिणाम अधिक खिलाड़ियों की तुलना में वहाँ players1 + players2 में हैं (परिणाम कुछ खिलाड़ियों की दोहराता शामिल हैं)

उत्तर

10

इस चाल करना चाहिए होता है Complex lookups with Q objects

+0

आपको बहुत बहुत धन्यवाद! मुझे नहीं पता था कि 'क्यू' में 'गेम 1' सभी खेलों को फिर से शुरू करेगा। मुझे बताओ, आप 'games1 = self' के बजाय 'games1__pk = self.pk' का उपयोग क्यों करते हैं? क्या इस तरह से कोई फायदे हैं? – imkost

+0

@imkost: मैं बस इसका उपयोग कर रहा हूं। मेरा मानना ​​है कि 'games1 = self' का स्पष्ट रूप से' games1__pk = self.pk' में अनुवाद किया जा सकता है (यदि यह आपको एक ही परिणाम देता है)। तर्क नाम में '__' होने से यह भी स्पष्ट हो जाता है कि कुछ 'जॉइन' क्वेरी में शामिल हैं। – Tadeck

11

एक शायद अधिक शब्दार्थ स्पष्ट समाधान के लिए:

def get_all_players(self): 
    return (self.players1.all() | self.players2.all()).distinct() 
+2

यह निश्चित रूप से अधिक स्वच्छ समाधान है। –