У меня есть две модели A
и B
. Все B
объекты имеют внешний ключ к A
объект. Учитывая ряд A
объекты, должен там так или иначе использовать ORM для получения ряда B
объекты, содержащие новый объект, создаются для каждого A
объект.
Вот упрощенный пример:
class Bakery(models.Model):
town = models.CharField(max_length=255)
class Cake(models.Model):
bakery = models.ForeignKey(Bakery, on_delete=models.CASCADE)
baked_at = models.DateTimeField()
Таким образом, я ищу запрос, который возвращает новый пирог, испеченный в каждой пекарне в Анитауне, США.
Из документации...
Загрузите HTML из удаленного файла и вставьте его в DOM.
Загрузка удаленной страницы с помощью HTTP-запроса. Это низкоуровневая реализация AJAX в jQuery.
загрузка
предназначена специально для выборки (через GET, если не предусмотрены параметры, то используется POST) HTML-страницы и непосредственной вставки ее в выбранные узлы (выбранные с помощью $ (селектор)
части $ (селектор) .load (...)
.
$ .ajax (...)
- более общий метод, который позволяет делать запросы GET и POST, и не делает ничего конкретного с ответом.
Я призываю вас прочитать документацию.
-121--1236924- load ()
инициирует запрос Ajax на получение HTML, который при возврате устанавливается в заданный селектор.
Все функции jQuery Ajax являются просто обертками для $ .ajax ()
так что:
$("#id").load(...);
, вероятно, эквивалентно:
$.ajax({
url: "...",
dataType: "html",
success: function(data) {
$("#id").html(data);
}
});
-121--1236922- Насколько я знаю, нет одношагового способа сделать это в Django ORM.
Но вы можете разделить его на два запроса:
bakeries = Bakery.objects.annotate(
hottest_cake_baked_at=Max('cake__baked_at')
)
hottest_cakes = Cake.objects.filter(
baked_at__in=[b.hottest_cake_baked_at for b in bakeries]
)
Если id's тортов продвигаются вместе с bake_at отметками времени, вы можете упростить и устранить неоднозначность вышеуказанного кода (в случае, если два торта приходят одновременно, вы можете получить оба из них):
hottest_cake_ids = Bakery.objects.annotate(
hottest_cake_id=Max('cake__id')
).values_list('hottest_cake_id', flat=True)
hottest_cakes = Cake.objects.filter(id__in=hottest_cake_ids)
Кредиты BTW за это достаются Дэниелу Розману, который однажды ответил на мой аналогичный вопрос:
Если вышеупомянутый метод слишком медленный, то я знаю и второй метод - вы можете написать пользовательский SQL, производящий только те Торты, которые являются самыми горячими в соответствующих пекарнях, определить его как базу данных VIEW, а затем написать неуправляемую модель Джанго для него. Он также упоминается в приведенном выше потоке django-users. Прямая ссылка на оригинальную концепцию здесь:
Надеюсь, что это поможет.
Это должно сделать работу:
from django.db.models import Max
Bakery.objects.annotate(Max('cake__baked_at'))