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