Как сделать запрос внутреннего соединения с той же таблицей, используя ORM Django - PullRequest
0 голосов
/ 14 июля 2020

Запрос, который должен быть реализован с помощью ORM, выглядит следующим образом:

SELECT t2.*
FROM sub_menu AS t1
INNER JOIN sub_menu AS t2 ON (t1.sub_menu_id = t2.parent_sub_menu_id)
WHERE t1.sub_menu_id = 1;

Модель выглядит следующим образом:

class SubMenu(models.Model):
    sub_menu_id = models.AutoField(primary_key=True)
    menu = models.ForeignKey('commons.MainMenu', related_name='sub_menus', on_delete=models.CASCADE)
    parent_sub_menu_id = models.IntegerField(blank=True, null=True)
    name = models.CharField(max_length=50)
    en_name = models.CharField(max_length=50, blank=True)
    ord = models.IntegerField()
    api = models.CharField(max_length=255, blank=True)
    api_method = models.CharField(max_length=7, blank=True)
    api_detail = models.CharField(max_length=255, blank=True)
    menu_type_cd = models.CharField(max_length=5, blank=True)
    menu_auth_type_cd = models.CharField(max_length=5)
    is_common = models.BooleanField(default=False)
    is_ns = models.BooleanField(default=False)
    spc_auth = models.BooleanField(default=False)
    spc_auth_cd = models.CharField(max_length=5, blank=True)
    create_dt = models.DateTimeField(auto_now_add=True)
    update_dt = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'sub_menu'
        unique_together = ('api', 'api_method',)

Без использования необработанного метода , Возможна ли реализация с ORM Django?

Спасибо.

1 Ответ

1 голос
/ 14 июля 2020

Вы должны правильно установить соотношение в вашей модели: https://docs.djangoproject.com/en/3.0/ref/models/fields/#module - django .db.models.fields.related . Тогда parent_sub_menu должен быть:

class Submenu:
    parent_sub_menu = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)

Затем запустите генерацию и миграцию БД. Приведенный ниже запрос должен работать.

И никогда не объявляйте отношения, как вы делаете прямо сейчас, вместо этого используйте Модель через присланную мной документацию.

Django уже делает это за вас. Вы можете просто отфильтровать соответствующее поле. https://docs.djangoproject.com/en/3.0/topics/db/queries/#lookups -это-отношения-размах

SubMenu.objects.filter(parent_sub_menu__sub_menu_id=1)
...