Запрос Django, которые получают новые объекты от различных категорий

У меня есть две модели 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()

Таким образом, я ищу запрос, который возвращает новый пирог, испеченный в каждой пекарне в Анитауне, США.

71
задан funnydman 16 November 2019 в 19:57
поделиться

2 ответа

Из документации...

$ (селектор) .load (..)

Загрузите HTML из удаленного файла и вставьте его в DOM.

$ .ajax (...)

Загрузка удаленной страницы с помощью 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_cak‌​e_id', flat=True)

hottest_cakes = Cake.objects.filter(id__in=hottest_cake_ids)

Кредиты BTW за это достаются Дэниелу Розману, который однажды ответил на мой аналогичный вопрос:

http://groups.google.pl/group/django-users/browse_thread/thread/3b3cd4cbad478d34/3e4c87f336696054?hl=pl&q =

Если вышеупомянутый метод слишком медленный, то я знаю и второй метод - вы можете написать пользовательский SQL, производящий только те Торты, которые являются самыми горячими в соответствующих пекарнях, определить его как базу данных VIEW, а затем написать неуправляемую модель Джанго для него. Он также упоминается в приведенном выше потоке django-users. Прямая ссылка на оригинальную концепцию здесь:

http://web.archive.org/web/20130203180037/http ://wolfram.kriesing.de/blog/index.php/2007/django-nice-and-critical-article # comment-48425

Надеюсь, что это поможет.

31
ответ дан 24 November 2019 в 13:07
поделиться

Это должно сделать работу:

from django.db.models import Max
Bakery.objects.annotate(Max('cake__baked_at'))
5
ответ дан 24 November 2019 в 13:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: