在Django中过滤具有相同M2M关系的不同项
我创建了一些Django模型,用于在联盟中注册游戏。有些简化,这就是它看起来的样子在Django中过滤具有相同M2M关系的不同项,django,django-models,django-queryset,Django,Django Models,Django Queryset,我创建了一些Django模型,用于在联盟中注册游戏。有些简化,这就是它看起来的样子 class Participant(models.Model): first_name = models.CharField(u"First name", max_length=50) last_name = models.CharField(u"Last name", max_length=50) class Match(models.Model): players = models
class Participant(models.Model):
first_name = models.CharField(u"First name", max_length=50)
last_name = models.CharField(u"Last name", max_length=50)
class Match(models.Model):
players = models.ManyToManyField(Participant)
我决定通过M2M将模型关联起来,因为我想方便地查询包含某个参与者的游戏,如果我选择使用两个带有“player\u one”
和“player\u two”
的字段,就会觉得很麻烦。这也使得系统在添加两个以上参与者的游戏方面具有一定的灵活性
无论如何,有些联赛允许两名球员多次面对面,同时也允许自由安排,即一名球员可以打20场比赛,而另一名球员只打了8场
问:我如何设计一个查询,让我过滤所有只包含唯一匹配的匹配?即。Jen打了12场比赛,但其中3场是对Paul的比赛,我只想数一数其中的一场,就可以得到她面对的所有独特对手的名单。注意:这个解决方案可能效率不高,我相信还有更好的。 如果您同意更改模型结构,您可以将另一个字段
unique\u matches
添加到Participant
模型:
class Participant(models.Model):
first_name = models.CharField(u"First name", max_length=50)
last_name = models.CharField(u"Last name", max_length=50)
unique_matches = models.ManyToManyField(Match)
然后,当您需要创建一个新的比赛
记录时,您可以检查这些球员以前是否相互比赛过?
。并根据以下内容更新唯一匹配项
字段:
# assume request.user is jen right now
paul = Participant.objects.get(id=3)
if not paul in request.user.unique_matches.all():
request.user.unique_matches.add(paul)
您可以在创建每个匹配记录后创建此控件
稍后,如果您进行以下查询:
matches = request.user.unique_matches.all()
这将给你独特的配对
第二种解决方案
如果希望保留现有模型结构,可以尝试以下方法(实际上,这可能是更好的方法):
然后,您可以在任何地方使用此方法,如:
matches = request.user.unique_matches()
我没有测试这些解决方案。如果发生任何错误,请告诉我,我们可以尝试修复
matches = request.user.unique_matches()