Используя django, как я могу объединить два запроса от, разделяют модели на один запрос?

Файл политики аудита указывается при запуске apiserver:

Вы можете передать файл с политикой в ​​kube-apiserver, используя флаг --audit-policy-file.

13
задан Taryn 16 July 2013 в 19:45
поделиться

2 ответа

Я предложил бы, чтобы Вы использовали Образцовое наследование.

Создайте базовую модель, которая содержит дату и заголовок. Разделите на подклассы Msg1 и Msg2 от него, как описано. Сделайте все свои запросы (чтобы заполнить страницу) использование базовой модели и затем переключиться на производный тип в последний момент.

Действительно большая вещь о наследовании состоит в том, что django затем позволяет Вам использовать базовую модель во внешних ключах из других моделей, таким образом, можно подать целую более гибкую заявку. Под капотом это - просто таблица для базовой модели с таблицей на подмодель, содержащую непосредственные ключи.

11
ответ дан 2 December 2019 в 00:47
поделиться

"объедините эти два запроса в один запрос, отсортируйте его по дате и нумеруйте страницы его?"

  1. Это - объединение SQL. Покиньте Django ORM и используйте объединение SQL. Это не блестяще быстро, потому что SQL должен создать временный результат, который это сортирует.

  2. Создайте временный результат, который может быть отсортирован. Так как список имеет метод сортировки, необходимо будет объединить два результата в один список.

  3. Запишите алгоритм слияния, который принимает два набора запроса, нумеруя страницы результаты.


Править. Вот алгоритм слияния.

def merge( qs1, qs2 ):
    iqs1= iter(qs1)
    iqs2= iter(qs2)
    k1= iqs1.next()
    k2= iqs2.next()
    k1_data, k2_data = True, True
    while k1_data or k2_data:
        if not k2_data:
            yield k1
            try:
                k1= iqs1.next()
            except StopIteration:
                k1_data= False
        elif not k1_data:
            yield k2
            try:
                k2= iqs2.next()
            except StopIteration:
                k2_data= False
        elif k1.key <= k2.key:
            yield k1
            try:
                k1= iqs1.next()
            except StopIteration:
                k1_data= False
        elif k2.key < k1.key: # or define __cmp__.
            yield k2
            try:
                k2= iqs2.next()
            except StopIteration:
                k2_data= False
        else:
            raise Exception( "Wow..." )

Можно свернуться в разбиении на страницы:

def paginate( qs1, qs2, start=0, size=20 ):
    count= 0
    for row in merge( qs1, qs2 ):
        if start <= count < start+size:
            yield row
        count += 1
        if count == start+size:
            break
2
ответ дан 2 December 2019 в 00:47
поделиться
Другие вопросы по тегам:

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