如何使用 Django 的 ORM 使用相同的 table 进行内部连接查询

How to make an inner join query with same table using Django's ORM

用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',)

不使用 raw method,是否可以使用 Django 的 ORM 实现?

谢谢。

您应该在您的模型上正确建立关系: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-that-span-relationships

SubMenu.objects.filter(parent_sub_menu__sub_menu_id=1)