Использование MySQL REGEXP для фильтрации строк с помощью Django ORM

У меня есть модель, которая имеет поле FileField и в этой модели у нас миллионы записей.

class MyModel(models.Model):
    media = models.FileField(upload_to=my_function, db_index=True)
    ...

Эти медиазаписи хранятся в базе данных как;

  • media/some/folder/filename.jpg
  • media/filename.jpg
  • media/2021091240-10328.JPG
  • media/aXay-123.jpeg
  • media/some/another/folder/202110-12-12.jpeg

etc. и мне нужно найти записи, которые не имеют вложенного пути, как /some/folder/ или /some/another/folder/ с помощью django orm __iregex lookup.

Итак, я попробовал что-то вроде;

MyModel.objects.filter(media__iregex=r"^media/[0-9a-zA-Z\-][.][a-zA-Z]")

но он не совпадает и я не понимаю, как написать правильный regex [mysql regexp].

Как я могу сделать фильтр с mysql regexp с помощью Django orm, чтобы получить записи только с шаблоном типа; media/filename.extension?

Ваш regex не имеет квантификатора, и поэтому выберет ровно один символ для группы символов [0-Aa-zA-Z\-].

Вы можете просто отфильтровать элементы, содержащие как минимум две косые черты с помощью:

MyModel.objects.filter(media__iregex=r'^media/[^/]+$')
Вернуться на верх