Результаты запроса Django получают все значения одного и того же поля

#django #django-queryset

Вопрос:

Есть ли способ получить все значения набора запросов формы поля без перебора и добавления в массив?

Я бы сделал, как показано ниже, в качестве простого примера.

У меня есть класс отчетов с полем посещения FK.

 results = Report.objects.all()

visits = []
for res in results:
   visits.append(res.visit)

 

Но есть ли способ сделать что-то вроде:

посещения = результаты.посещение (и получите тот же результат, что и в цикле запросов выше).

Редактировать:

Классы ниже.

 class Report(models.Model):
    ...
    completed_at = models.DateTimeField()
    due_date = models.DateField()
    planned_date = models.DateTimeField()
    visit = models.ForeignKey(ReportVisit)

class ReportVisit(models.Model):
    contact_name = models.CharField()
    time_in = models.DateTimeField()
    lat_in = models.CharField()
    long_in = models.CharField()

 

Комментарии:

1. Пожалуйста, поделитесь своей Report моделью и моделью res.visit .

2. Я отредактировал, чтобы включить. Я вырезал то, что, по моему мнению, не нужно.

3. вы указали а related_name в своем ForeignKey ?

Ответ №1:

Вы можете отфильтровать Visit модель с помощью:

 ReportVisit.objects.filter(report__isnull=False).distinct() 

.distinct() метод [Django-doc] предотвратит извлечение Visit столько же раз, сколько есть связанных Report объектов. Вы можете опустить это, если хотите получить то же ReportVisit самое один раз за Report раз .

Комментарии:

1. Хорошо, я действительно использовал подобное раньше, но в другом случае использования. Мне просто нужно отфильтровать на основе известного набора отчетов, в которых я не уверен. Пример: результаты = Отчет.объекты.фильтр(фильтры) и получайте оттуда посещения. Извините, я должен был поставить это под сомнение, но я не думал об этом как о решении.

2. @Spirconi: ты все еще можешь это сделать. Затем вы должны просто отфильтровать с ReportVisit.objects.filter(report__foo__bar=qux) помощью вместо Visit.objects.filter(foo__bar=qux) , поэтому посмотрите «сквозь» report модель.

3. Идеально, в моем случае это были результаты = ReportVisit.objects.filter( отчет__isnull=False, отчет__in=отчеты )

4. @Spirconi: Я бы очень не советовал этого делать, так как это создает подзапросы, а некоторые базы данных обрабатывают их неэффективно. Путем фильтрации по связанной модели база данных работает с ` СОЕДИНЕНИЕМ` и WHERE вместо этого.

Ответ №2:

Попробуй с другой стороны:

 Visit.objects.filter(report__isnull=False)