#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)