«неправильно сформированная шестнадцатеричная строка UUID» при фильтрации запроса GraphQL по нескольким идентификаторам (Graphene-Django) - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть модели Django Photo и Tag, которые имеют отношение многие ко многим, соединенные через модель PhotoTag.Это соответствующий бит из models.py - обратите внимание, что они наследуются от UUIDModel, поэтому UUID являются первичным ключом, а не идентификатором автоматического увеличения по умолчанию.

Models

class Photo(UUIDModel):
    taken_at                            = models.DateTimeField(null=True)
    taken_by                            = models.CharField(max_length=128, blank=True, null=True)
    aperture                            = models.DecimalField(max_digits=3, decimal_places=1, null=True)
    exposure                            = models.CharField(max_length=8, blank=True, null=True)
    iso_speed                           = models.PositiveIntegerField(null=True)
    ...

class Tag(UUIDModel):
    name            = models.CharField(max_length=128)
    ...

class PhotoTag(UUIDModel):
    photo       = models.ForeignKey(Photo, related_name='photo_tags')
    tag         = models.ForeignKey(Tag, related_name='photo_tags')
    ...

ДляСхема Графена-Джанго У меня есть два фильтра, определенных для all_photos - выборка фотографий по именам тегов и выборка по идентификаторам тегов, где тег назначается через отношение photo_tags.Ниже приведено определение схемы - photo_tags__tag__id = graphene.String() - это моя попытка предотвратить ошибку неправильно сформированная шестнадцатеричная строка UUID , и я надеялся, что, сделав ее graphene.String(), можно разделить ее.

Схема

class CustomNode(graphene.Node):
    class Meta:
        name = 'Node'

    @staticmethod
    def to_global_id(type, id):
        return id

class PhotoInterface(graphene.Interface):
    photo_tags__tag__id = graphene.String()

class PhotoNode(DjangoObjectType):
    class Meta:
        model = Photo
        interfaces = (CustomNode, PhotoInterface)

class PhotoFilter(django_filters.FilterSet):
    class Meta:
        model = Photo
        fields = {
            'photo_tags__tag__id': ['exact', 'in'],
            'photo_tags__tag__name': ['exact', 'icontains', 'in'],
        }

class Query(object):
    all_photos = DjangoFilterConnectionField(PhotoNode, filterset_class=PhotoFilter)

Ниже приведен тип запроса, который я хотел бы выполнить.Пользователь может выбрать несколько тегов, и результатом будет пересечение подходящих фотографий.in, вероятно, не является правильным фильтром для использования в этом случае, поэтому любые советы по этому поводу будут оценены.

Запрос

{
  allPhotos(photoTags_Tag_Id_In: "f24c88fe-74ee-4b2d-beaf-3da6f68cfe3c,6522e86e-fcb4-4a17-8887-f2560d3fe3da") {
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges {
      node {
        id
        takenAt
      }
    }
  }
}

Фильтрация по tag__name, как показано ниже, работает без ошибок (хотя это объединение, а не пересечение).

allPhotos(photoTags_Tag_Name_In: "Cat,Bike") { ... }
...