gpt4 book ai didi

python - python django 中带有 OR 条件的 LEFT JOIN

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:35 26 4
gpt4 key购买 nike

我想要的只是用 Python Django 语法编写以下 SQL 查询。我研究了很多,但无法得到我想要的结果。你能帮我一下吗?

    SELECT * FROM thread
LEFT JOIN user
ON (thread.user1_id = user.id OR thread.user2_id = user.id)
WHERE user.id = 9

我的模型:

 class Thread(models.Model):
last_message = models.TextField(max_length=100)
user1_id = models.IntegerField()
user2_id = models.IntegerField()

最佳答案

如果不借助一些原始 SQL,就无法使用 Django ORM 创建精确的查询。问题在于连接条件中的 OR。

但是,由于您没有从用户表中选择任何行,因此您可以创建具有相同结果的不同查询。

首先使用外键定义模型。

from django.db import models
from django.contrib.auth.models import User

class Thread(models.Model):
last_message = models.TextField(max_length=100)
user1 = models.ForeignKey(User)
user2 = models.ForeignKey(User)

class Meta:
db_table = 'thread' # otherwise it will be: appname_thread

然后您可以执行查询。

from django.db.models import Q

threads = Thread.objects.filter(Q(user1__id=9) | Q(user2__id=9))

生成的 SQL 将如下所示:

SELECT * FROM thread
LEFT JOIN user AS user1
ON (thread.user1_id = user1.id)
LEFT JOIN user AS user2
ON (thread.user2_id = user2.id)
WHERE (user1.id = 9 OR user2.id = 9)
<小时/>

您可以通过完全避免连接来改进这一点。

# note the single underscore!
threads = Thread.objects.filter(Q(user1_id=9) | Q(user2_id=9))

生成以下 SQL。

SELECT * FROM thread
WHERE (user1_id = 9 OR user2_id = 9)
<小时/>

如果您还需要在同一查询中获取用户实例(在这种情况下您确实需要联接),您有两个选择。

  1. 使用包含联接的第一个查询,然后根据 Python 中的 ID 选择正确的用户。

    for thread in threads:
    if thread.user1.id == 9:
    user = thread.user1
    else:
    user = thread.user2
  2. 或者使用原始 SQL 来获取您想要的确切查询。在这种情况下,您可以使用没有定义外键的模型。

    threads = Thread.objects.raw('''
    SELECT *, user.id AS user_id, user.name as user_name FROM thread
    LEFT JOIN user
    ON (thread.user1_id = user.id OR thread.user2_id = user.id)
    WHERE user.id = 9''')
    for thread in threads:
    # threads use the ORM
    thread.id
    # user fields are extra attributes
    thread.user_id
    thread.user_name

关于python - python django 中带有 OR 条件的 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36936944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com