Как я могу вернуть Django queryset, только если значение существует в другой таблице? - PullRequest
0 голосов
/ 04 февраля 2020

Может быть, поздний час зажег мой мозг, потому что я уверен, что это невероятно легко. Я хочу вернуть набор запросов всех кандидатов, которые есть в CallList конкретного поиска. Мое мнение передается. Я прочитал много сообщений о ценностях и списках значений, но я изо всех сил. Любая помощь будет оценена.

Candidate.objects.filter (????)

class Prospecting(models.Model):
    name = models.CharField(max_length=40)

class CallList(models.Model):
    prospecting = models.ForeignKey(Prospecting, on_delete=models.CASCADE, null=True)
    candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)

class Candidate(models.Model):
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Не уверен, что это лучшее решение, но я работал со следующим:

list = Candidate.objects.filter (pk__in = CallList.objects.filter (Q (user = self.request. пользователь) & Q (prospecting = Prospecting.objects.get (pk = self.kwargs ['tagid']))). values_list ('андидат '))

Где tagid - это идентификатор в Prosepcting. Примечание. Пользователь и кандидат - это разные таблицы. Пользователь находится в таблице кандидатов, так как это мультитенантный сайт. Спасибо за вашу помощь.

0 голосов
/ 04 февраля 2020

Just Note : first_name и last_name уже присутствуют в модели пользователя по умолчанию django. Вы можете использовать это, если хотите.

---- Редактировать отсюда ----

1) Добавить связанное имя в оба поля ForeignKey (пожалуйста, используйте разные и лучшие имена). Кроме того, вы должны использовать поля related_name в ForeignKey и OneToOne. Мы также можем использовать _set, но я предпочитаю related_name .

class CallList(models.Model):
    prospecting = models.ForeignKey(Prospecting, on_delete=models.CASCADE, null=True, related_name='prosp_name')
    candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='cand_name')

Если вы используете функцию на основе функции, попробуйте это:

def func_name(request, prospecting_id):
   qry = Candidate.objects.filter(cand_name__prospecting__pk=prospecting_id)

Если Вы также хотите проверить, вошел ли пользователь в систему (для одного запроса будет только один пользователь, поэтому технически он будет возвращать набор запросов, только если пользователь вошел в систему и вошел в систему, пользователь удовлетворяет условию, в противном случае он вернет None). (Если вы хотите, чтобы все кандидаты, связанные с prospecting_id через список вызовов, не проверяли зарегистрированного пользователя.)

from django.db.models import Q
def func_name(request, prospecting_id):
   filt = Q(cand_name__prospecting__pk=prospecting_id) & Q(user=request.user)
   qry = Candidate.objects.filter(filt)

Надеюсь, это сработает, если нет, ответьте.

...