Методы класса модели Django для предопределенных значений

Я работаю над некоторым Django-кодом, который имеет модель как это:

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

Существуют, приблизительно 10 предопределили code/text-pairs, которые хранятся в базе данных. Рассеянный вокруг кодовой базы я вижу код как это:

status = Status.objects.get(code=0) # successful
status = Status.objects.get(code=1) # failed

У меня был бы метод для каждого так, чтобы код выглядел бы примерно так вместо этого:

status = Status.successful()
status = Status.failed()
etc...

Действительно ли это возможно? Я заглянул к материалу менеджера, но я действительно не нашел путь. Время это к действительно прочитайте руководство?

В Java это был бы статический метод, и в Ruby Вы просто определите метод на сам, но дело не в этом легкий в Python, не так ли?

17
задан ypnos 6 February 2010 в 13:57
поделиться

1 ответ

ОСНОВНАЯ причина, по которой ваш код является таким медленным, заключается в том, что вы используете файл RandomStartFile, который всегда был довольно медленным с точки зрения производительности. Я предлагаю использовать «BufferedInputStream», чтобы вы могли воспользоваться всеми преимуществами кэширования на уровне ОС для дискового ввода-вывода.

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

    public static byte [] hash(MessageDigest digest, BufferedInputStream in, int bufferSize) throws IOException {
    byte [] buffer = new byte[bufferSize];
    int sizeRead = -1;
    while ((sizeRead = in.read(buffer)) != -1) {
        digest.update(buffer, 0, sizeRead);
    }
    in.close();

    byte [] hash = null;
    hash = new byte[digest.getDigestLength()];
    hash = digest.digest();
    return hash;
}
-121--1880666-

Если вы принимаете решение об очереди, обычно требуется только поставить в очередь и удалить из очереди элементы. Вы хотите знать, является ли очередь пустой, и хотите посмотреть на передний элемент, если он вам нужен, или оставить его для кого-то другого. Очередь - это своего рода буфер, который позволяет избежать блокировки, если отправитель быстрее, чем получатель. С помощью очереди получатель может определить , когда будет считана следующая запись. Очередь может реализовать некоторую (основанную на приоритете) сортировку и решить, какой элемент является передним.

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

Некоторые действия можно выполнить, но можно подкласс ListQueue и переопределить некоторые методы. Так что если вы хотите дополнительный метод size () , это может быть решением:

public class MyListQueue <T extends Comparable<T>> extends ListQueue<T> {

  private size = 0;

  public void enqueue(T element) {
    size++;
    super.enqueue(element);
  }

  public T dequeue() {
    if (isEmpty()) {
       return null; // that's a guess...
    }
    size--;
    super.dequeue(element);
  }

  public int size() {
    return size;
  }
}

Я заменил AnyType на T, что является более распространенным.

-121--5086135-

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

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    @classmethod
    def successful(cls):
        return cls.objects.get(code=0)

    @classmethod
    def failed(cls):
        return cls.objects.get(code=1)

Обратите внимание, что get () , вероятно, вызовет различные исключения, такие как Status.DousNotExist и MultipleObjectRetured .

И для примера реализации того, как сделать то же самое с помощью Django менеджеров, вы могли бы сделать что-то подобное:

class StatusManager(models.Manager):
    def successful(self):
        return self.get(code=1)

    def failed(self):
        return self.get(code=0)

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    objects = StatusManager()

Где, вы могли бы сделать Status.objects.successful () и Status.objects.failed () , чтобы получить желаемое.

38
ответ дан 30 November 2019 в 11:37
поделиться
Другие вопросы по тегам:

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