если на этот вопрос ответили где-то еще, то мне жаль, но через 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)