Вот моя альтернатива. Это объектно-ориентированное и больше похоже на вещи 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
Нет единого способа извлечения нескольких несвязанных моделей в одном 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 , если у родителя нет связанного указанного экземпляра дочерней модели.
Этот подход позволил бы вам выполнять такие операции, как сортировка и нарезка на уровне базы данных, с недостатком дополнительной сложности модели (вам потребуется отдельный запрос для получения данных дочерней модели)