Как я могу использовать CommaSeparatedIntegerField в Django?

Я написал две простые функции, которые дают ту же функциональность, что и $stmt->get_result();, но они не требуют драйвера mysqlnd.

Вы просто замените

$result = $stmt->get_result(); на $fields = bindAll($stmt);

и

$row= $stmt->get_result(); с $row = fetchRowAssoc($stmt, $fields);.

(Чтобы получить числа возвращаемых строк, вы можете использовать $stmt->num_rows.)

Вам просто нужно разместить эти две функции, которые я написал где-то в вашем PHP-скрипте. (например, справа внизу)

function bindAll($stmt) {
    $meta = $stmt->result_metadata();
    $fields = array();
    $fieldRefs = array();
    while ($field = $meta->fetch_field())
    {
        $fields[$field->name] = "";
        $fieldRefs[] = &$fields[$field->name];
    }

    call_user_func_array(array($stmt, 'bind_result'), $fieldRefs);
    $stmt->store_result();
    //var_dump($fields);
    return $fields;
}

function fetchRowAssoc($stmt, &$fields) {
    if ($stmt->fetch()) {
        return $fields;
    }
    return false;
}

Как это работает :

В моем коде используется функция $stmt->result_metadata();, чтобы выяснить, сколько и какие поля возвращаются, а затем автоматически привязывает полученные результаты к предварительно созданным ссылкам. Работает как очарование!

38
задан Mariusz Jamro 27 February 2012 в 11:15
поделиться

2 ответа

Ищем исходный код django ...

class CommaSeparatedIntegerField(CharField):
    def formfield(self, **kwargs):
        defaults = {
            'form_class': forms.RegexField,
            'regex': '^[\d,]+$',
            'max_length': self.max_length,
            'error_messages': {
                'invalid': _(u'Enter only digits separated by commas.'),
            }
        }
        defaults.update(kwargs)
        return super(CommaSeparatedIntegerField, self).formfield(**defaults)

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

Вы можете определить его как поле ввода:

class Foo(models.Model):
    int_list = models.CommaSeparatedIntegerField(max_length=200)

И заполнить его так:

f = Foo(int_list="1,2,3,4,5")
22
ответ дан 27 November 2019 в 03:50
поделиться

Я как раз имел дело с CommaSeparatedIntegerField в моем последнем проекте. Я использовал MySQL, и казалось, что предоставление строки целочисленных значений, разделенных запятыми, очень удобно для БД, например, «1,2,3,4,5». Если вы хотите оставить это поле пустым, просто передайте пустую строку.

Он действительно действует как CharField и выглядит для меня странным образом ... Я получил такие значения, как "[1, 2, 3, 4, 5] "включая скобки в моей базе данных! Так что берегись!

6
ответ дан 27 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

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