使用 Django QuerySet 进行外键无约束连接

从内部结合(直积的结果中,用户ID相同的项目)中筛选。

Customer.objects.extra(
  tables=['django_user'],
  where=['customers.created_user_id=django_user.id']
).extra(select={'username': "django_user.last_name+django_user.first_name"})

SELECT (django_user.last_name+django_user.first_name) AS `username`,
       `customers`.`id`,
       `customers`.`created_at`,
       `customers`.`created_user_id`
FROM `customers`,
     `django_user`
WHERE (customers.created_user_id=django_user.id)
ORDER BY `customers`.`id` ASC

外部合作

以下是您要求的内容的中文回答:

您可以在此链接(https://stackoverflow.com/questions/21271835/left-join-django-orm)找到关于Django ORM中左连接的讨论。
https://github.com/django/django/blob/master/django/db/models/sql/datastructures.py#L26-L139 是Django框架中的一个文件,该文件包含了关于SQL数据结构的相关代码。

joinField = ForeignKey(
    to=User,
    on_delete=lambda: x,
)

joinField.opts = Options(Customer._meta)
joinField.opts.model = Customer
joinField.get_joining_columns = lambda: (("created_user_id", "id"),)

j = Join(
    User._meta.db_table,
    Customer._meta.db_table,
    'T1',
    "LEFT JOIN",
    joinField,
    True
)

q = Customer.objects.values()
q = q.extra(select={'username': "django_user.last_name+django_user.first_name"})

q.query.join(j)

print(q.query)
广告
将在 10 秒后关闭
bannerAds