【问题标题】:How to make an inner join query with same table using Django's ORM如何使用 Django 的 ORM 对同一张表进行内连接查询
【发布时间】:2020-11-03 10:15:58
【问题描述】:

用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实现吗?

谢谢。

【问题讨论】:

  • 可以分享模型吗?
  • @ruddra 我更新了我的问题。请检查一下。

标签: python django orm django-orm


【解决方案1】:

你应该在你的模型上正确地建立关系: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)

【讨论】:

  • 感谢您的回复。它引发异常'无法将关键字'parent_sub_menu'解析为字段',因为'parent_sub_menu'不是SubMenu中包含的属性。
  • @ScottKim 我更新了答案,因为您错误地声明了模型。
  • 哇...非常好!我学到了一项新技能。感谢您的帮助!
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 2022-01-05
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多