Search code examples
djangomany-to-many

How to dynamically compose an OR query filter in Django to delete pairs of objects from ManyToManyFields?


if i want to implement this for delete multiple object from many to many field i need to create a dynamic filter like the below one.

PizzaToppingRelationship = Pizza.toppings.through
PizzaToppingRelationship.objects.filter(
    Q(pizza=my_pizza, topping=pepperoni) |
    Q(pizza=your_pizza, topping=pepperoni1) |
    Q(pizza=your_pizza2, topping=mushroom)
).delete()

However, I want to create this query filter from a list of query objects. How to do that?

e.g. [{"pizza": <my_pizza>, "topping": }, {"pizza": <your_pizza>, "topping": }, {"pizza": <your_pizza2>, "topping": }]


Solution

  • You can convert this into a Q object:

    from django.db.models import Q
    
    data = [
        {'pizza': my_pizza, 'topping': pepperoni},
      , {'pizza': your_pizza, 'topping': pepperoni1}
      , {'pizza': your_pizza2, 'topping': mushroom}
    ]
    
    PizzaToppingRelationship = Pizza.toppings.through
    PizzaToppingRelationship.objects.filter(
        Q(*[Q(**dati) for dati in data], _connector=Q.OR)
    ).delete()