में क्वेरीसमूहों विलय मैं 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 में हैं (परिणाम कुछ खिलाड़ियों की दोहराता शामिल हैं)
आपको बहुत बहुत धन्यवाद! मुझे नहीं पता था कि 'क्यू' में 'गेम 1' सभी खेलों को फिर से शुरू करेगा। मुझे बताओ, आप 'games1 = self' के बजाय 'games1__pk = self.pk' का उपयोग क्यों करते हैं? क्या इस तरह से कोई फायदे हैं? – imkost
@imkost: मैं बस इसका उपयोग कर रहा हूं। मेरा मानना है कि 'games1 = self' का स्पष्ट रूप से' games1__pk = self.pk' में अनुवाद किया जा सकता है (यदि यह आपको एक ही परिणाम देता है)। तर्क नाम में '__' होने से यह भी स्पष्ट हो जाता है कि कुछ 'जॉइन' क्वेरी में शामिल हैं। – Tadeck