【问题标题】:Django filter a queryset based on another table without specified relationshipDjango根据另一个没有指定关系的表过滤查询集
【发布时间】:2020-10-08 15:07:29
【问题描述】:

好的,所以这可能是一个奇怪的问题,但这是我的问题。在没有涉及太多细节的情况下,我需要向属性发送通知,但前提是存在相应的标题搜索。这是我的模型。两者之间有明确的关系。但它们在一个共同的领域具有共同的价值。他们都有一个属性包裹号(通知的包裹号在外键可访问的相关字段中)

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”的通知,并且在文件中使用相同的包裹号进行未过期的标题搜索。查询集检查的排序,以确保宗地编号在活动标题搜索列表中。

谢谢,

【问题讨论】:

  • 据我所知,Notice 和 TitleSearch 没有通过 ForeignKey 链接。
  • 这是正确的。我只需要在通知发出之前的这个确切时刻查看是否有有效的标题搜索。我不想用钥匙把它们绑在一起,因为它们过期了。

标签: python sql django django-queryset


【解决方案1】:

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

因此,如果不创建两个模型之间的关系,我就无法找到一种方法来检查通知中是否存在有效的标题搜索。

作为一种解决方法,我查询了所有未过期的标题搜索并转换为包裹号列表(我用来跨表查找的键)

# 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 文档,它说一些 dbs 很难执行嵌套查询,你应该做 2 个简单的查询。因此构建一个列表并在其中检查。

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

附言我还从其他人那里找到了这个包,描述了一个类似的问题,也可以帮助你。 https://www.reddit.com/r/django/comments/7fvlf7/join_two_models_without_a_foreign_key/

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

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2015-10-14
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多