gpt4 book ai didi

Django 1.7 左外连接

转载 作者:行者123 更新时间:2023-12-04 15:20:31 25 4
gpt4 key购买 nike

我有一个这样的模型

class Job(models.Model):
description = models.CharField(max_length=255)
user = models.ForeignKey(User)
date = models.DateField()
slot = models.CharField(max_length=10, choices=SLOT_CHOICES)
location = models.ForeignKey(Location)
objects = JobManager()
searches = geomodels.GeoManager()

class Meta:
verbose_name_plural = "Job"
unique_together = ('date', 'slot', 'user')

def __str__(self):
return "{0}-{1}".format(self.user.first_name, self.date)

class Applied(models.Model):
user = models.ForeignKey(User)
job = models.ForeignKey(Job, null=True, blank=True)
action_taken = models.BooleanField(default=False)
is_declined = models.BooleanField(default=False)

class Meta:
verbose_name_plural = "Job Applications"
unique_together = ('user', 'job', )

我想搜索某个日期范围内的所有工作,并显示用户是否可以申请、已经申请或已被拒绝。应用信息在应用模型中。
    jobs = Job.searches.filter(**kwargs)\
.filter(date__range=(date_from, date_to),
visibility=VisibilityStatus.PUBLIC,
status=JobStatus.AVAILABLE)\
.prefetch_related('applied_set')\
.select_related('user__surgeryprofile__location')\
.order_by('date')

但我无法让它工作,它没有对数据库中的应用表进行左连接。任何如何让它工作的建议。

谢谢

最佳答案

Django ORM 执行 左外连接 当 FK 是 可空 .

解决方案:只需添加 null=True在这个 FK job = models.ForeignKey(Job, null=True, blank=True)您希望加入获取空值,Django 将通过 LEFT OUTER JOIN 更改 INNER JOIN。

这是合乎逻辑的,因为当目标表可能与查询中最左边的表不完全匹配时,左外连接是有意义的。

更新:这仅适用于 ForeignKey 字段和 select_related,不适用于具有 prefetch_related 的 ManyToMany 字段。

M2M 领域的可能解决方案:

  • 调试生成的 SQL(DEBUG=True,使用记录器 'django.db.backends' 记录)
  • 复制它并将 INNER JOIN 替换为 LEFT OUTER JOIN
  • 执行 Model.objects.raw(sql_with_left_join)

  • https://docs.djangoproject.com/en/1.8/topics/db/sql/#performing-raw-sql-queries

    这应该给出与以前相同的结果,但添加那些没有 M2M with Applied 的 Job。

    更新 2:Django 中的自定义 JOINS 版本 <=1.5,不适用于 1.6+

    在此博客条目中找到: https://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

    来自 StackOverflow: https://stackoverflow.com/a/12943120/1090700

    关于Django 1.7 左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937226/

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