У меня есть 3 модели, у TaggedObject есть GenericRelation с ObjectTagBridge. И у ObjectTagBridge есть ForeignKey для модели тегов.
class TaggedObject(models.Model):
"""
class that represent a tagged object
"""
tags = generic.GenericRelation('ObjectTagBridge',
blank=True, null=True)
class ObjectTagBridge(models.Model):
"""
Help to connect a generic object to a Tag.
"""
# pylint: disable-msg=W0232,R0903
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
tag = models.ForeignKey('Tag')
class Tag(models.Model):
...
когда я прикрепляю тег к объекту, я создаю новый объект ObjectTagBridge и присваиваю его тегу ForeignKey тег, который я хочу прикрепить. Это работает нормально, и я могу легко получить все теги, которые я прикрепил к моему объекту. Но когда я хочу получить (отфильтровать) все объекты, которые имеют Tag1 и Tag2, я попытался что-то вроде этого:
query = Q(tags__tag=Tag1) & Q(tags__tag=Tag2)
object_list = TaggedObjects.filter(query)
но теперь мой object_list пуст, потому что он ищет TaggedObjects, которые имеют один ObjectTagBridge с 2 объектами тега, первый с Tag1, а второй с Tag2.
В моем приложении будут более сложные Q-запросы, чем этот, поэтому я думаю, что мне нужно решение с этим Q-объектом. Фактически любая комбинация бинарных союзов, например: (...) and ( (...) or not(...))
Как я могу отфильтровать это правильно? Каждый ответ приветствуется, может быть, есть и другой способ добиться этого.
спасибо за помощь !!!