Узел
Может быть, стоит отметить, что Node
является частью Facebook Relay specs (не GraphQL спецификации). Тем не менее, большинство фреймворков (включая Graphene) реализуют эту спецификацию из-за тесной связи между Relay и GraphQL.
По существу Node
- это интерфейс, который реализует только поле ID
, которое должно быть глобально уникальным идентификатором для объекта. ID
s являются непрозрачными (типичное соглашение относится к base64('type:id')
), приложения не должны пытаться полагаться на эту деталь реализации.
Node
выставлен как часть корневого запроса, где приложения могут запрашивать объекты с известным ID
удобным способом, например. переназначение, выбор полей, которые не были извлечены.
{
node(id: ID!) {
... on User {
id
userId
name
}
... on Company {
id
companyId
owner: {
userId
name
}
}
...
}
}
Это обеспечивает удобство не того, чтобы определить точку запроса для каждой модели вы разоблачить (например, message(messageId)
или user(userId)
). Это также позволяет запрашивать объект без пересекающих через путь объекта, например,
{
user {
friends {
pages {
name
}
}
}
}
// vs
{
node(id) {
... on Page {
name
}
}
}
Подключение
Как Node
, Connection
также часть Relay specs, который сделал свой путь к основному принятию.
На первый взгляд, концепция edges
кажется излишней, но она решает какой-то хитрый случай использования. Подумайте о необходимости раскрывать отношения «многие ко многим», такие как «друзья», обычно реализуемые в базе данных с таблицей соединений.
+---------+ +------------+
| users | | friends |
+---------+ +------------+
| user_id | <------ | left_id |
| .... | \--- | right_id |
+---------+ | created_at |
+------------+
Теперь легко отобразить «Друзья с [дата] здесь», подвергнув friends.created_at
в объекте края.
{
user {
friends {
edges {
created_at <---
user {
id
userId
name
}
}
}
}
}
edges
существу определяет соотношение между nodes
.
Я также новичок в Relay. Это стандартная настройка. Проверьте это объяснение https: // facebook.github.io/relay/graphql/connections.htm – t1m0
Причина, по которой этот вопрос возник, заключалась в том, что мы хотели использовать graphene-jjano в нашем приложении без зависимости от реле для фильтрации. Я смог найти технику для добавления фильтрации без использования здесь [link] (https://github.com/graphql-python/graphene/issues/215) –
Я понимаю, что вы имеете в виду. Как отмечено в вашей ссылке, преимущество придерживаться соглашений о ретрансляции заключается в том, что графен дает вам предварительно настроенную настройку для подкачки. Запрос GraphQL с "pageInfo { hasNextPage hasPreviousPage startCursor endCursor }" работает автоматически. – t1m0