Получите несколько моделей в одном QuerySet, упорядоченном по метке времени

Вот моя альтернатива. Это объектно-ориентированное и больше похоже на вещи mysql / mysqli.

class MMySqliStmt{
    private $stmt;
    private $row;

    public function __construct($stmt){
        $this->stmt = $stmt;
        $md = $stmt->result_metadata();
        $params = array();
        while($field = $md->fetch_field()) {
            $params[] = &$this->row[$field->name];
        }
        call_user_func_array(array($stmt, 'bind_result'), $params) or die('Sql Error');
    }

    public function fetch_array(){
        if($this->stmt->fetch()){
            $result = array();
            foreach($this->row as $k => $v){
                $result[$k] = $v;
            }
            return $result;
        }else{
            return false;
        }
    }

    public function free(){
        $this->stmt->close();
    }
}

Использование:

$stmt = $conn->prepare($str);
//...bind_param... and so on
if(!$stmt->execute())die('Mysql Query(Execute) Error : '.$str);
$result = new MMySqliStmt($stmt);
while($row = $result->fetch_array()){
    array_push($arr, $row);
    //for example, use $row['id']
}
$result->free();
//for example, use the $arr
0
задан CodeSpent 21 March 2019 в 01:21
поделиться

1 ответ

Нет единого способа извлечения нескольких несвязанных моделей в одном QuerySet. Что вы можете сделать, это использовать наследование моделей, иметь базовую модель для всех моделей событий. Со следующей структурой модели:

class Event(models.Model):
    timestamp = models.DateTimeField()
    user = models.ForeignKey(User)
    ...

class WebhookSubscription(Event):
   ...

class WebhookEvent(Event):
   ...

class TokenRefresh(Event):
   ...

class LogEvent(Event):
   ...

Вы можете делать запросы напрямую, используя модель событий, например:

events = Event.objects.filter(user=user).order_by('timestamp')

Это даст вам экземпляры событий, которые не будут содержать данные для дочерних моделей. , Вы можете получить дочерний экземпляр от родителя точно так же, как и в случае с OneToOneField (вот как фактически django моделирует наследование, создавая две таблицы и связывая их внешним ключом):

event.webhooksubscription
event.webhookevent
event.tokenrefresh
event.logevent

Они будут возвращать экземпляры дочерней модели, если таковые существуют, и вызывают исключение ObjectNotFound , если у родителя нет связанного указанного экземпляра дочерней модели.

Этот подход позволил бы вам выполнять такие операции, как сортировка и нарезка на уровне базы данных, с недостатком дополнительной сложности модели (вам потребуется отдельный запрос для получения данных дочерней модели)

0
ответ дан Ozgur Akcali 21 March 2019 в 01:21
поделиться
Другие вопросы по тегам:

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