Django запрос с отношениями - PullRequest
0 голосов
/ 14 января 2020

У меня грязный и старый запрос, который я пытаюсь преобразовать из SQL в Django ORM, и я не могу понять это. Так как исходный запрос не должен публиковаться c, вот что-то похожее на то, с чем я работаю:

Таблица 1
id

Таблица 2
Идентификатор
имя пользователя
активный
день рождения
table_1_fk

Таблица 3
Id
сумма
table_1_fk

Мне нужно закончить список активных пользователей (имя пользователя), отсортировано по дате, отображается сумма. Ссылки Table1 в таблице 2 и 3 не в порядке. Основные проблемы, с которыми я сталкиваюсь:

  • Как мне получить их только с помощью ORM (без зацикливания / выполнения или с трудом, если нужно)
  • Если я не могу использовать только ORM и решить просто l oop на части, которые мне нужны, как бы я даже создал один объект для отображения в таблице, не повторяя все подряд несколько раз?

Мои мысли процессы:

Таблица 2 активна -> получить таблицу 1 -> найти таблицу 1 pk в таблице 3 -> добавить информацию таблицы 3 в таблицу 1?

Таблица 1 -> получить Таблица 2 Активы, Таблица1 -> получить суммы таблицы 3 -> l oop для сопоставления согласно table1_fks

1 Ответ

0 голосов
/ 14 января 2020

Вы можете выполнить связанные ссылки, используя Таблицу1. Если ваши модели выглядят примерно так:

from django.db import models
from django.db.models import F

class Table1(models.Model):
    ...

class Table2(models.Model):
    username = models.CharField(max_length=100)
    active = models.BooleanField()
    birthday = models.DateField()  # Sorted by date
    table1 = models.ForeignKey(Table1, related_name="table2")

class Table3(models.Model):
    amount = models.IntegerField()
    table1 = models.ForeignKey(Table1, related_name="table3")

Вы можете сделать позже:


>>> users = (
    Table1.objects
        .filter(table2__active=True)
        .annotate(
            username=F("table2__username"), 
            amount=F("table3__amount"), 
            birthday=F("table2__birthday")
        )
        .order_by("-birthday")
        .values("username", "amount", "birthday")
)
>>> print(users)
[
  ["user1", 100.0, "2020-01-13"],
  ["user2", 890.0, "2020-01-10"],
  ["user3", None, "2020-01-01"],
]

Это полностью зависит от того, как реализованы ваши классы моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...