У меня есть страница администратора модели django, и я хочу использовать ее функцию поиска, поэтому я определил поля search_field следующим образом:
search_fields = (
'name', 'email',
'vacancy__position__name',
'vacancy__location__name',
)
Проблема в том, что поле 'вакансия' обнуляется, но поиск не может найти элементы с нулевым 'вакансией', поэтому я копаюсь в sql, который он выполнил, и обнаружил проблему:
SELECT "testapp_subject"."name", "testapp_subject"."email",
FROM "testapp_candidate"
INNER JOIN "testapp_subject" ON ("testapp_candidate"."subject_ptr_id" = "testapp_subject"."id")
LEFT OUTER JOIN "testapp_vacancy" ON ("testapp_candidate"."vacancy_id" = "testapp_vacancy"."id")
LEFT OUTER JOIN "testapp_position" ON ("testapp_vacancy"."position_id" = "testapp_position"."id")
INNER JOIN "testapp_location" ON ("testapp_vacancy"."location_id" = "testapp_location"."group_ptr_id")
WHERE (UPPER("testapp_subject"."name"::text) LIKE UPPER(%j%)
OR UPPER("testapp_subject"."email"::text) LIKE UPPER(%j%)
OR UPPER("testapp_position"."name"::text) LIKE UPPER(%j%)
OR UPPER("testapp_location"."name"::text) LIKE UPPER(%j%) )
ORDER BY "testapp_candidate"."subject_ptr_id" DESC
Как видите, последнее ВНУТРЕННЕЕ СОЕДИНЕНИЕ должно быть ВЛЕВОМ НАРУЖНОГО СОЕДИНЕНИЯ.
Я попытался покопаться в части, генерирующей sql, чтобы увидеть, что происходит, но код слишком сложен для чтения. Кто-нибудь знает, что происходит, или кто-то сталкивался с такой же ситуацией?
Ниже приведена упрощенная структура модели для моего случая.
class Group(models.Model):
pass
class Organization(models.Model):
name = models.CharField(max_length = 50)
class Position(models.Model):
name = models.CharField(max_length=80)
class Location(Group):
name = models.CharField(max_length=80)
org = models.ForeignKey(Organization)
class Vacancy(models.Model):
position = models.ForeignKey(Position)
location = models.ForeignKey(Location)
date = models.DateField(default=datetime.now())
filled = models.BooleanField(default=False)
class Subject(models.Model):
org = models.ForeignKey(Organization, verbose_name="organization")
name = models.CharField(max_length = 50)
email = models.CharField(max_length = 85, null=True, blank=True)
class Candidate(Subject):
vacancy = models.ForeignKey(Vacancy, null=True, blank=True)