如何在Django+GraphQL中正确地与多对多关系交互?

czq61nw1  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(108)

如何在Django+GraphQL中正确交互多对多关系?

我有一个游戏模型,它与用户模型有多对多的关系。

class Game(models.Model):
    name = models.CharField(max_length=256, blank=True)
    users = models.ManyToManyField(to=User, blank=True, related_name='games')

class User(AbstractUser):
    email = models.EmailField(max_length=128, verbose_name='email address', blank=False)

我需要将它连接到GraphQL,这样我就可以通过mutation读取和修改这些字段。
我已经有了一个可以在不使用users的情况下使用Game的模式,但现在我还需要添加用户

{
  games {
    edges {
      node {
        id
        name
      }
    }
  }
}

但是当我添加users时,它不起作用,因为db中的Game表没有users字段。它有一个games_game_users表来描述它们之间的关系。
我如何修改我的代码才能使用game.users字段?

gkl3eglg

gkl3eglg1#

如果你想在Django+GraphQL中与多对多关系交互,你应该正确定义你的节点。
这就是我的情况下应该如何定义的:

class UserNode_(DjangoObjectType):
    class Meta:
        model = User
        interfaces = (graphene.relay.Node,)

class GameNode(DjangoObjectType):
    class Meta:
        model = Game
        interfaces = (graphene.relay.Node,)

    users = graphene.List(UserNode_)

    def resolve_users(value_obj, info):
        return value_obj.users.all()

所以这个GraphQL请求将显示你的游戏和连接的用户

{
  games {
    edges {
      node {
        id
        title
        users {
          id
          username
          email
        }
      }
    }
  }
}

要在游戏中添加或删除用户,请使用add()remove()方法:

game.users.add(new_user)
game.users.remove(old_user)

相关问题