Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中过滤具有相同M2M关系的不同项_Django_Django Models_Django Queryset - Fatal编程技术网

在Django中过滤具有相同M2M关系的不同项

在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

我创建了一些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.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()