4

これが別の場所で回答されている場合は、申し訳ありませんが、仕事の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 は、Fact オブジェクトからの ManyToMany 関係に基づくもののみです。

これまでに作成したものはデータを返しますが、プレーヤーの親に基づいてファクトをフィルタリングしません。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()

NPCスキーマ

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)
4

1 に答える 1

4

まだ読んでいる人のために、「filteredFacts」フィールドを作成することでこれを回避できました。

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

filtered_facts = graphene.List(FactGroup)

def resolve_filtered_facts(self, info, **kwargs):
    groups = defaultdict(list)
    facts = self.known_facts.all()
    for fact in facts:
        groups[fact.npc].append(fact.fact)
    grouped_facts = []
    for key, value in groups.items():
        grouped_facts.append(FactGroup(npc=key, facts=value))

    return grouped_facts

これは、プレイヤーに知られているすべての事実を取得し、それらを NPC ごとにグループ化します。反対側からでも同じ結果が得られます...

于 2019-11-24T14:47:34.847 に答える