Django根据没有指定关系的另一个表过滤查询集

时间:2020-06-18 14:13:30

标签: python sql django django-queryset

好,所以这可能是一个奇怪的问题,但这是我的问题。无需太多细节,我需要向属性发送通知,但前提是必须进行相应的标题搜索。这是我的模特。两者之间存在指定的关系。但是它们在一个共同领域中有着共同的价值。它们都有一个属性包裹号(通知的包裹号在外键可访问的相关字段中)

class Notice(models.Model):
    status_choice = [
        ("SendNotice", "SendNotice"),
        ("NoticeSent", "NoticeSent")
    ]

    violation_fk = models.OneToOneField(Violation, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    notice_number = models.CharField(max_length=10)
    date_sent = models.DateTimeField(blank=True, null=True)
    status = models.CharField(choices=status_choice, max_length=10)
    instructions = models.TextField(blank=True, null=True)


class TitleSearch(models.Model):
    address = models.CharField(max_length=50)
    parcel_number = models.CharField( max_length=24)
    title_search_date = models.DateField(auto_now=False, auto_now_add=False)
    expiration_date = models.DateField(auto_now=False, auto_now_add=False)
    owner = models.CharField(max_length=100)
    attn_line = models.CharField(max_length=150, blank=True)
    street_address = models.CharField(max_length=150)
    city = models.CharField(max_length=25)
    state = models.CharField(max_length=2)
    zip_code = models.CharField(max_length=5)

所以。这是我的问题。如果没有标题搜索,我将无法向物业发送通知。但是标题搜索会在设定的时间后过期,因此我不必将它们捆绑在一起。

我正在尝试获取一个查询集,该查询集将选择状态为“ SendNotice”且在文件中具有相同包裹编号的未过期标题搜索中的所有通知。进行查询集检查,以确保地块编号在活动标题搜索列表中。

谢谢

1 个答案:

答案 0 :(得分:0)

好的,与此同时,我发现了某种解决问题的方法。它可以工作,但是有点难看。

因此,如果不在两个模型之间建立关系以从通知中检查是否存在有效的标题搜索,我将找不到方法。

作为一种变通方法,我查询了所有未过期的“标题”搜索,并将其转换为包裹编号列表(我用来在表格中查找的关键字)

# Get list of Title Search for jank in query
active_title_searches = TitleSearch.objects.filter(expiration_date__gte=timezone.now())
active_title_searches = active_title_searches.values_list("parcel_number", flat=True)

然后,我在过滤器中添加了__in搜索,以检查父表中的地块编号是否在我们之前创建的有效标题搜索的地块编号列表中。

# grab only notices that have title searches
ts_junk_notice = Notice.objects.filter(status="SendNotice", violation_fk__parcel_number__in=active_title_searches)

这似乎可以解决问题。它有点像一个子查询,以检查是否有一个有效的标题搜索,但是我正在某处阅读django文档,它说某些数据库很难执行嵌套查询,而应该执行2个简单查询。因此,建立一个清单并在其中检查。

我不确定这是否对任何人都有帮助,但希望有帮助。

p.s。我还从其他人那里找到了此软件包,描述了类似的问题,也可能会对您有所帮助。 https://www.reddit.com/r/django/comments/7fvlf7/join_two_models_without_a_foreign_key/

https://github.com/martsberger/django-joinfield