Python Graphene работает со многими отношениями - PullRequest
2 голосов
/ 05 ноября 2019

если на этот вопрос ответили где-то еще, то мне жаль, но через 2 дня после работы и до сих пор нет сигары ...

У меня есть модель игрока:

class Player(models.Model):
    name = models.CharField(max_length=60)
    discord_id = models.CharField(max_length=60, null=True)
    known_npcs = models.ManyToManyField(NPC)

Игрок может знатьмного NPC, и любой NPC может быть известен многим игрокам.

NPC не является чем-то особенным:

class NPC(models.Model):
    image = models.ImageField()
    name = models.CharField(max_length=50)
    description = models.TextField()

Последняя часть головоломки - это факт. Факт - это некоторая информация, прикрепленная к NPC, однако человек может знать NPC, но неОбязательно все факты, связанные с NPC, известны Игроку, поэтому Факт выглядит следующим образом:

class Fact(models.Model):
    fact = models.TextField()
    known_by = models.ManyToManyField(Player)
    npc = models.ForeignKey(NPC, on_delete=models.DO_NOTHING, null=True)

Теперь в графене я хочу создать запрос Player и allPlayers, который бы дал мне следующее:

{
  allPlayers {
    name
    knownNPCs {
      image
      name
      description
      factsKnown {
        fact
      }
    }
  }
}

Там, где factKnown - только те, которые основаны на отношении ManyToMany из объекта Fact.

То, что я создал до сих пор, возвращает данные, но не фильтруетФакты, основанные на родителе игрока, просто отображают все факты, связанные с NPC :(

Схема фактов

class FactType(DjangoObjectType):
    class Meta:
        model = Fact
        filter_fields = ["id"]

class Query(object):
    fact = Node.Field(FactType)
    all_Facts = graphene.List(FactType)

    def resolve_all_Facts(self, info, **kwargs):
        return Fact.objects.all()

NPCSchema

class NPCType(DjangoObjectType):
    class Meta:
        model = NPCS

class Query(object):
    all_NPCs = graphene.Field(NPCType)
    facts = graphene.List(FactType)
    def resolve_all_NPCs(self, info, **kwargs):
        return NPCS.objects.all()

PlayerSchema:

class PlayerType(DjangoObjectType):
    class Meta:
        model = Player
        interfaces = (Node,)
        filter_fields = ["id"]


class Query(object):
    player = Node.Field(PlayerType)
    all_players = graphene.List(PlayerType)

    def resolve_all_players(self, info, **kwargs):
        return Player.objects.all()

    def resolve_player(self, info, **kwargs):
        player = Player.objects.filter(id=info.id)
...