@arghhh

Как переписать legacy raw sql запрос на django orm?

Есть legacy база, переделать её возможности нет. Хочу сделать к ней REST API на django.
С помощью inspectdb получились следующие модели:

class Alert(models.Model):
    id = models.BigAutoField(primary_key=True)
    server_id = models.IntegerField()
    rule_id = models.BigIntegerField()
    level = models.SmallIntegerField(blank=True, null=True)
    timestamp = models.BigIntegerField()

    class Meta:
        managed = False
        db_table = 'alert'
        unique_together = (('id', 'server_id'),)


class Category(models.Model):
    cat_id = models.AutoField(primary_key=True)
    cat_name = models.CharField(unique=True, max_length=32)

    class Meta:
        managed = False
        db_table = 'category'


class Signature(models.Model):
    rule_id = models.BigIntegerField(unique=True)
    level = models.IntegerField(blank=True, null=True)
    description = models.CharField(max_length=255)

    class Meta:
        managed = False
        db_table = 'signature'


class SignatureCategoryMapping(models.Model):
    rule_id = models.BigIntegerField()
    # cat_id = models.IntegerField()
    cat_id = models.ForeignKey(Category, to_field='cat_id', 
                 db_column='cat_id', null=True, on_delete=models.SET_NULL, db_constraint=False)

    class Meta:
        managed = False
        db_table = 'signature_category_mapping'
        unique_together = (('id', 'rule_id', 'cat_id'),)
'

Есть вот такой запрос к этим таблицам:

a = Alert.objects.raw('''SELECT a.id, a.level, a.rule_id, q.cat_id, q.cat_name FROM 
        (SELECT rule_id, cat_name, scm.cat_id FROM signature_category_mapping AS scm, category AS c WHERE scm.cat_id = c.cat_id) 
        AS q, alert AS a WHERE (q.rule_id = a.rule_id) ORDER BY a.timestamp DESC LIMIT 10;''')


Из таблицы alert выбираются события, далее по rule_id в signature_category_mapping и из нее в по cat_id в category что бы получить cat_name.
Таблица signature_category_mapping содержит пары rule_id и cat_id, одному rule_id могут принадлежать несколько cat_id, например (1, 1) (1, 2) и т.д.
Создать связь many to many у меня не получилось, django ругается что rule_id не уникальный ключ.

Подскажите, пожалуйста, возможно ли составить этот запрос с помощью django orm?
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mrxor
Simple is better than complex
Да, можно. Посмотрите про вложенные запросы на django orm тут и тут
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы