search_fields в Django вел себя странно в Django ModelAdmin - PullRequest
1 голос
/ 09 декабря 2011

У меня есть страница администратора модели 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...