Сравнение полей m2m-отношений разных моделей Django, связанных с одной m2m-моделью
Я следую этому вопросу, чтобы фильтровать по M2M field
: Django filter queryset __in for *every* item in list
Я использую .annotation
подход.
Мои модели:
class Options(models.Model):
name = models.CharField(max_length=50)
class Product(models.Model):
options = models.ManyToMany(Category)
class Item(models.Model):
options = models.ManyToMany(Category)
Я пытаюсь отфильтровать Product
экземпляр, чтобы он содержал все categories
, поскольку Item
экземпляр имеет:
items = Item.objects.all()
for item in items:
item_options = [option.name for option in item.options.all()]
queryset=models.Product.objects.filter(
status=Status.COMPLETED,
options__name__in=item_options
)\
.annotate(num_options=Count("options"))\
.filter(num_options=len(item_options))
В большинстве случаев это работает, за исключением случаев, когда Item
не содержит никаких опций. В этом случае я хотел бы сопоставить экземпляр Product
, который также не содержит никаких опций, но это не удается, возвращая ни одного объекта.