2

I have a list of dictionaries with app_label and model keys that I got from the ContentType model:

model_list = [
    {
        'app_label': 'store',
        'model': 'product',
    },
    {
        'app_label': 'store',
        'model': 'profile',
    },
]

I need to generate a set of combined Q objects from this to use as a ForeignKey.limit_choices_to argument. This is the output I need:

limit = Q(app_label = 'store', model = 'product') | Q(app_label = 'store', model = 'profile')

So I can use it in a model like this:

class Review(models.Model):
    content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    # ...

Anyone know how to create a list of combined Q objects with the | operator by looping through this list of dictionaries?

Tomasz Jakub Rup
  • 10,502
  • 7
  • 48
  • 49
austinheiman
  • 939
  • 1
  • 12
  • 17

1 Answers1

1

Using reduce with operator.or_ (or lambda a, b: a | b):

limit = reduce(operator.or_, (Q(**condition) for condition in model_list))
falsetru
  • 357,413
  • 63
  • 732
  • 636