У меня есть модели 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") { ... }