updateMutation не обновляет данные - PullRequest
0 голосов
/ 01 марта 2020

Моя цель - автоматически обновлять и отображать новые данные для {data.contact.contactInformation}, как только я нажимаю кнопку для updateMutation. Тем не менее, это работает только после того, как я обновлю sh страницу. Насколько я понимаю, идентификаторы должны быть возвращены, и тогда Apollo должен обработать все остальное, в соответствии с Документация по мутации данных Apollo .

Но, похоже, в моем коде есть какая-то ошибка. Вы видите, что с ним не так?

const FEED_QUERY = gql`
  query Contact($id: Int!) {
    contact(id: $id) {
      id
      contactInformation
      belongsTo {
        id
        username
        email
      }
    }
  }
`;

const UPDATE_CONTACT_DETAILS = gql`
  mutation updateContactDetails($contactInformation: String!) {
    updateContactDetails(contactInformation: $contactInformation) {
      id
      contactInformation
      belongsTo {
        id
        username
        email
      }
    }
  }
`;

function EmergencyContact() {
  const params = useParams();
  const { loading, error, data } = useQuery(FEED_QUERY, {
    variables: { id: params.contactId }
  });
  const [updateContactDetails] = useMutation(UPDATE_CONTACT_DETAILS);
  const [value, setValue] = useState("");

  if (loading) return "Loading...";
  if (error) return `Error! ${error.message}`;

  return (
    <>
      <div key={data.contact.id}>
        {data.contact.contactInformation}
        <form
          onSubmit={e => {
            e.preventDefault();
            updateContactDetails({
              variables: {
                contactInformation: value
              }
            });
            setValue("");
          }}
        >
          <input value={value} onChange={e => setValue(e.target.value)} />
          <button type="submit">Update Contact Information</button>
        </form>
      </div>
    </>
  );
}

export default EmergencyContact;

schema.py

class ContactInformationType(DjangoObjectType):
    class Meta:
        model = ContactInformation


class Query(graphene.ObjectType):
    contact = graphene.Field(ContactInformationType, id=graphene.Int())
    contact_access_key = graphene.Field(
        ContactInformationType, access_key=graphene.String()
    )
    contact_informations = graphene.List(ContactInformationType)

    @staticmethod
    def resolve_contact_informations(parent, info, **kwargs):
        return ContactInformation.objects.all()

    @staticmethod
    def resolve_contact_access_key(parent, info, **kwargs):
        access_key = kwargs.get("access_key")

        if not access_key:
            return

        contact_info = ContactInformation.objects.filter(access_key=access_key).first()
        if info.context.user != contact_info.belongs_to:
            raise PermissionDenied()

        return contact_info

    @staticmethod
    @login_required
    def resolve_contact(parent, info, **kwargs):
        id = kwargs.get("id")
        if id is not None:
            contact_info = ContactInformation.objects.filter(belongs_to__pk=id).first()
            if info.context.user != contact_info.belongs_to:
                raise PermissionDenied()

            return contact_info


class UpdateContactDetails(graphene.Mutation):
    id = graphene.ID()
    contact_information = graphene.String()
    belongs_to = graphene.Field(UserType)

    class Arguments:
        contact_information = graphene.String()

    @staticmethod
    def mutate(self, info, contact_information):
        contact_detail = ContactInformation.objects.get(belongs_to=info.context.user)
        contact_detail.contact_information = contact_information
        contact_detail.save()
        return UpdateContactDetails(
            id=contact_detail.pk,
            contact_information=contact_detail.contact_information,
            belongs_to=contact_detail.belongs_to,
        )


class Mutation(graphene.ObjectType):
    update_contact_details = UpdateContactDetails.Field()

1 Ответ

0 голосов
/ 01 марта 2020

Apollo использует и id, и __typename для генерации ключа кэша. Таким образом, пользователь с id из 1 и постом с id из 1 не будут использовать один и тот же ключ - его ключи будут User:1 и Post:1 соответственно. Если ваше поле user и ваше updateContactDetails возвращают разные типы (даже если эти типы имеют одинаковые поля), они получат разные ключи кэша, и Apollo не будет знать, что ему нужно обновить запрос user. Это должно быть исправлено на бэкэнде (т.е. убедитесь, что оба поля имеют одинаковый тип) - если это не может быть исправлено, вам нужно будет вручную обновить кеш, предоставив функцию update для вашей ловушки useMutation .

...