Django фильтровать набор запросов на основе другой таблицы без указанной связи - PullRequest
0 голосов
/ 18 июня 2020

Хорошо, это, вероятно, немного странный вопрос, но вот моя проблема. Не вдаваясь в подробности, мне нужно отправить уведомление свойствам, но только при наличии соответствующего поиска по заголовку. Вот мои модели. Между ними есть определенные отношения. Но у них есть общая ценность в общей сфере. У них обоих есть номер участка свойств (номер участка для уведомления находится в связанном поле, доступном с помощью внешнего ключа)

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)

Итак. вот моя проблема. Я не могу отправить уведомление собственности без поиска по названию. НО поиски по заголовку истекают через установленный период времени, поэтому я не обязательно хочу ie их вместе.

Я пытаюсь получить набор запросов, который выберет все уведомления, имеющие статус "SendNotice" И выполнить поиск по заголовку с тем же номером посылки, который не истек. Это своего рода проверка набора запросов, чтобы убедиться, что номер посылки ВХОДИТ в список активных поисков заголовков.

Спасибо,

1 Ответ

0 голосов
/ 18 июня 2020

Хорошо, а пока я нашел несколько хитрый способ обойти мою проблему. Это работает, но немного некрасиво.

Поэтому я не мог найти способ, не создавая взаимосвязи между двумя моделями, чтобы проверить наличие действительного поиска по заголовку из уведомления.

в качестве работы я запросил все поиски заголовков, срок действия которых не истек, и преобразовал их в список номеров участков (ключ, который я использую для поиска по таблицам)

# 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 search, чтобы проверить, находится ли номер участка из родительской таблицы в списке номеров участков активного поиска по заголовкам, который мы создали ранее.

# 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 простых запроса. Поэтому создайте список и проверьте его.

Я не уверен, поможет ли это кому-нибудь, но надеюсь, что да.

ps Я также нашел этот пакет от кого-то другого, описывающего аналогичную проблему, которая может также помочь вам. https://www.reddit.com/r/django/comments/7fvlf7/join_two_models_without_a_foreign_key/

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

...